Spark:如果DataFrame具有架构,DataFrame如何成为数据集[Row]

时间:2016-10-07 10:27:02

标签: apache-spark apache-spark-sql apache-spark-dataset

This article声称Spark中的DataFrame等同于Dataset[Row],但this blog post显示DataFrame具有架构。

以博客文章为例,将RDD转换为DataFrame:如果DataFrameDataset[Row]相同,则将RDD转换为{ {1}}应该很简单

DataFrame

但相反它表明它是

val rddToDF = rdd.map(value => Row(value))

显然,数据框实际上是行和架构的数据集。

2 个答案:

答案 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的答案外),每个RowRow.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))