簡體   English   中英

Spark:如果 DataFrame 有架構,DataFrame 如何成為 Dataset[Row]

[英]Spark: How can DataFrame be Dataset[Row] if DataFrame's have a schema

這篇文章聲稱 Spark 中的DataFrame等效於Dataset[Row] ,但這篇博客文章表明DataFrame具有架構。

以博客文章中將 RDD 轉換為DataFrame :如果DataFrameDataset[Row] ,那么將RDD轉換為DataFrame應該是一樣簡單

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]

顯然,數據框實際上是行和模式的數據集。

在 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)

請注意(除了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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM