我知道使用.withColumn()
和UDF
向Spark DataSet添加新列的方法,它返回一個DataFrame。我也知道,我們可以將生成的DataFrame轉換爲DataSet。如何將數據列添加到數據集而不從DataFrame轉換並訪問它?
我的問題是:
- 如何DataSet的類型安全進場這裏,如果我們依然遵循着傳統的DF方法(即通過列名作爲UDF的輸入字符串)
- 是否有「像面向對象的方式」訪問列(不需要像字符串那樣傳遞列名),就像我們以前用RDD做的那樣,用於追加一個新列。
- 如何訪問像地圖,過濾器等正常操作中的新列?
例如:
scala> case class Temp(a : Int, b : String) //creating case class
scala> val df = Seq((1,"1str"),(2,"2str),(3,"3str")).toDS // creating DS
scala> val appendUDF = udf((b : String) => b + "ing") // sample UDF
scala> df.withColumn("c",df("b")) // adding a new column
res5: org.apache.spark.sql.DataFrame = [a: int, b: string ... 1 more field]
scala> res5.as[Temp] // converting to DS
res6: org.apache.spark.sql.Dataset[Temp] = [a: int, b: string ... 1 more field]
scala> res6.map(x =>x.
// list of autosuggestion :
a canEqual equals productArity productIterator toString
b copy hashCode productElement productPrefix
新列c
,即我已經使用.withColumn()
是無法訪問的添加,由於柱c
不在的情況下類Temp
(它僅包含a
& b
)在使用res5.as[Temp]
將其轉換爲DS時。
如何訪問列c
?
有沒有其他的方式來添加一列而不傳遞字符串? – vdep
@vdep''字符串'只是一個遵循問題脈絡的例子。 – maasg
不,我的意思是,我們可以做到這一點,而不需要在這裏傳遞列名'b'作爲字符串:'df.withColumn(「c」,df(「b」))' – vdep