2017-08-17 59 views
0

想一個struct列添加到數據幀,但結構有超過100 領域
我瞭解到,案例類可以改變結構柱,但情況每班不超過22場的極限(在線火花1.6.3與2.10.4階)。
可以普通類做到這一點嗎?我必須實現哪些功能或接口?
還有一個「org.apache.spark.sql.functions.struct」,但目前看來,它不能設置結構的字段的名稱。 提前致謝。我如何大的結構柱添加到數據幀

+0

去UDF如果可能.https://stackoverflow.com/questions/33826495/spark-scala-2-10-tuple-limit –

+0

我不明白你不能夠是什麼意思設置struct的字段名稱。你可以這樣做這樣 VAL領域=新StructField( 「名」,StringType,FALSE)::新StructField( 「時代」,IntegerType,FALSE)::名單(新StructField( 「時代」,IntegerType,FALSE)) – BDR

+0

謝謝巴拉吉雷迪。現在我已經有一個大約有40列的數據框,並且想要添加一個類型爲struct的新列。你的意思是我必須定義一個新的結構,其中包含現有的40個字段和具有超過100個字段的新結構? – xuhai

回答

2

但目前看來,它不能設置結構的字段的名稱。

可以。例如:

import org.apache.spark.sql.functions._ 

spark.range(1).withColumn("foo", 
    struct($"id".alias("x"), lit("foo").alias("y"), struct($"id".alias("bar"))) 
).printSchema 

root 
|-- id: long (nullable = false) 
|-- foo: struct (nullable = false) 
| |-- x: long (nullable = false) 
| |-- y: string (nullable = false) 
| |-- col3: struct (nullable = false) 
| | |-- bar: long (nullable = false) 
+1

非常感謝,這就是我想要的。 – xuhai

0

沒有必要定義測試用例類的這個結構,你可以創建結構類型是這樣的:

val struct = 
    StructType(
    StructField("a", IntegerType, true) :: 
    StructField("b", LongType, false) :: 
    StructField("c", BooleanType, false) :: Nil) 

這個結構可以有任意長度。

,那麼你可以讀數據幀這樣

val df = sparkSession.read.schema(struct).//your read method 
+0

感謝您的回答。現在我已經有一個大約有40列的數據框,並且想要添加一個類型爲struct的新列。你的意思是我必須定義一個結束現有的40個字段和新結構的新結構? – xuhai