This article声称Spark中的DataFrame
等同于Dataset[Row]
,但this blog post显示DataFrame
具有架构。
以博客文章为例,将RDD转换为DataFrame
:如果DataFrame
与Dataset[Row]
相同,则将RDD
转换为{ {1}}应该很简单
DataFrame
但相反它表明它是
val rddToDF = rdd.map(value => Row(value))
显然,数据框实际上是行和架构的数据集。
答案 0 :(得分:1)
在Spark 2.0中,代码中有:
type DataFrame = Dataset[Row]
这是Dataset[Row]
,仅仅是因为定义。
Dataset
也有架构,您可以使用printSchema()
函数进行打印。通常Spark会推断架构,因此您不必自己编写 - 但它仍然存在;)
您也可以执行createTempView(name)
并在SQL查询中使用它,就像DataFrames一样。
换句话说,Dataset
= DataFrame from Spark 1.5
+ encoder
会将行转换为您的类。合并Spark 2.0中的类型后,DataFrame只是Dataset[Row]
的别名,因此没有指定编码器。
关于转化:rdd.map()也会返回RDD
,它永远不会返回DataFrame。你可以这样做:
# Dataset[Row]=DataFrame, without encoder
val rddToDF = sparkSession.createDataFrame(rdd)
# And now it has information, that encoder for String should be used - so it becomes Dataset[String]
val rDDToDataSet = rddToDF.as[String]
# however, it can be shortened to:
val dataset = sparkSession.createDataset(rdd)
答案 1 :(得分:1)
注意(除T Gaweda的答案外),每个Row
(Row.schema
)都有一个架构。但是,在将此架构集成到DataFrame
(或Dataset[Row]
)
scala> Row(1).schema
res12: org.apache.spark.sql.types.StructType = null
scala> val rdd = sc.parallelize(List(Row(1)))
rdd: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row] = ParallelCollectionRDD[5] at parallelize at <console>:28
scala> spark.createDataFrame(rdd,schema).first
res15: org.apache.spark.sql.Row = [1]
scala> spark.createDataFrame(rdd,schema).first.schema
res16: org.apache.spark.sql.types.StructType = StructType(StructField(a,IntegerType,true))