當我使用select語句在Spark 2中檢索數據集時,基礎列會繼承查詢列的數據類型。如何更改Spark數據集上的模式
val ds1 = spark.sql("select 1 as a, 2 as b, 'abd' as c")
ds1.printSchema()
root
|-- a: integer (nullable = false)
|-- b: integer (nullable = false)
|-- c: string (nullable = false)
現在,如果我將它轉換爲case類,它將正確轉換值,但底層架構仍然是錯誤的。
case class abc(a: Double, b: Double, c: String)
val ds2 = ds1.as[abc]
ds2.printSchema()
root
|-- a: integer (nullable = false)
|-- b: integer (nullable = false)
|-- c: string (nullable = false)
ds2.collect
res18: Array[abc] = Array(abc(1.0,2.0,abd))
我「應該」可以指定編碼器,當我創建第二個數據集,但斯卡拉似乎忽略此參數來使用(這是一個BUG?):
val abc_enc = org.apache.spark.sql.Encoders.product[abc]
val ds2 = ds1.as[abc](abc_enc)
ds2.printSchema
root
|-- a: integer (nullable = false)
|-- b: integer (nullable = false)
|-- c: string (nullable = false)
所以只有這樣我才能看到這樣做,簡單地說,沒有非常複雜的映射就是使用createDataset,但是這需要在底層對象上進行收集,所以它並不理想。
val ds2 = spark.createDataset(ds1.as[abc].collect)