5

这篇文章声称DataFrameSpark 中的 a 等价于 a Dataset[Row],但是这篇博文显示 aDataFrame有一个模式。

以博客文章中将 RDD 转换为 a 的示例为例DataFrame:如果DataFrame与 相同Dataset[Row],那么将 an 转换RDD为 aDataFrame应该一样简单

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

但相反,它表明它是这个

val rddStringToRowRDD = rdd.map(value => Row(value))
val dfschema = StructType(Array(StructField("value",StringType)))
val rddToDF = sparkSession.createDataFrame(rddStringToRowRDD,dfschema)
val rDDToDataSet = rddToDF.as[String]

显然,数据框实际上是行和模式的数据集。

4

2 回答 2

10

在 Spark 2.0 中,代码中有: type DataFrame = Dataset[Row]

它是Dataset[Row],只是因为定义。

DatasetprintSchema()也有模式,您可以使用功能打印它。通常 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)
于 2016-10-07T10:55:20.450 回答
2

请注意(除了T GawedaRow的答案)每个( )都有一个关联的模式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))
于 2016-10-07T18:30:28.823 回答