scala - 如何使用 listOfData 和模式创建 spark DataFrame
问题描述
我正在尝试从数据列表中创建一个 DataFrame,并且还想在其上应用架构。从 Spark Scala 文档中,我尝试使用这个 createDataframe 签名,它接受行列表和架构作为 StructType。
def createDataFrame(rows: List[Row], schema: StructType): DataFrame
我在下面尝试的示例代码
import org.apache.spark.sql.types._
import org.apache.spark.sql.Row
val simpleData = List(Row("James", "Sales", 3000),
Row("Michael", "Sales", 4600),
Row("Robert", "Sales", 4100),
Row("Maria", "Finance", 3000)
)
val schema = StructType(Array(
StructField("name",StringType,false),
StructField("department",StringType,false),
StructField("salary",IntegerType,false)))
val df = spark.createDataFrame(simpleData,schema)
但我得到以下错误
command-3391230614683259:15: error: overloaded method value createDataFrame with alternatives:
(data: java.util.List[_],beanClass: Class[_])org.apache.spark.sql.DataFrame <and>
(rdd: org.apache.spark.api.java.JavaRDD[_],beanClass: Class[_])org.apache.spark.sql.DataFrame <and>
(rdd: org.apache.spark.rdd.RDD[_],beanClass: Class[_])org.apache.spark.sql.DataFrame <and>
(rows: java.util.List[org.apache.spark.sql.Row],schema: org.apache.spark.sql.types.StructType)org.apache.spark.sql.DataFrame <and>
(rowRDD: org.apache.spark.api.java.JavaRDD[org.apache.spark.sql.Row],schema: org.apache.spark.sql.types.StructType)org.apache.spark.sql.DataFrame <and>
(rowRDD: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row],schema: org.apache.spark.sql.types.StructType)org.apache.spark.sql.DataFrame
cannot be applied to (List[org.apache.spark.sql.Row], org.apache.spark.sql.types.StructType)
val df = spark.createDataFrame(simpleData,schema)
请提出我做错了什么。
解决方案
该错误告诉您它需要 Java 列表而不是 Scala 列表:
import scala.jdk.CollectionConverters._
val df = spark.createDataFrame(simpleData.asJava, schema)
如果您使用的是早于 2.13 的 Scala 版本,请参阅此问题以获取替代方案。CollectionConverters
另一种选择是传递一个 RDD:
val df = spark.createDataFram(sc.parallelize(simpleData), schema)
sc
作为 SparkContext 对象。