【发布时间】:2017-12-23 02:00:18
【问题描述】:
当我在 Spark 2 中检索数据集时,使用 select 语句,底层列会继承查询列的数据类型。
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 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))
当我创建第二个数据集时,我“应该”能够指定要使用的编码器,但 scala 似乎忽略了这个参数(这是一个 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)
【问题讨论】:
标签: scala apache-spark encoder apache-spark-dataset