具有特征的 Spark 2.0 数据集编码器

Posted

技术标签:

【中文标题】具有特征的 Spark 2.0 数据集编码器【英文标题】:Spark 2.0 Dataset Encoder with trait 【发布时间】:2017-02-22 09:03:03 【问题描述】:

我正在构建一个数据集,其中每个记录都映射到一个案例类(例如 CustomDataEntry 与原始类型)。

val dataset = spark.read (...) .as[CustomDataEntry]

到目前为止一切顺利

现在我正在编写一个转换器,它采用带有 CustomDataEntry 的 的数据集,进行一些计算并添加一些新列,例如。找到纬度和经度并计算 geohash

我的 CustomDataEntry 现在有一个属性/列 (geohash),它 存在于案例类中,但存在于数据集中.再次,这工作正常,但似乎不是很好,而不是 type safe(如果这甚至可以使用编码器)。

我可以将此作为选项字段添加到我的案例类中,但这看起来很混乱,而不是可组合。一种更好的方法似乎是我应该在 CustomDataEntry

上混合一些特征

例如

trait Geo
    val geohash:String

然后将数据集返回为

dataset.as[CustomDataEntry with Geo]

这行不通

错误:(21, 10) 无法找到存储在数据集中的类型的编码器。 原始类型(Int、String 等)和产品类型(案例类) 通过导入 spark.implicits._ 支持序列化 其他类型将在以后的版本中添加。 .as[CustomDataEntry with Geo]

答案似乎很明显(不支持,未来版本),但也许我忽略了什么?

【问题讨论】:

【参考方案1】:

编码器尚不存在,恕我直言,但您可以使用 Encoders.kryo[CustomDataEntry with Geo] 作为编码器解决方法。

【讨论】:

以上是关于具有特征的 Spark 2.0 数据集编码器的主要内容,如果未能解决你的问题,请参考以下文章

spark-ml 规范化器丢失元数据

如何在 Scala Spark 中使用具有许多条件的“.withColumn”为数据集创建新列

Spark 2.0 数据集与数据帧

如何从 Spark 2.0 中的 DataFrame 列创建数据集?

使用 Java 在 Spark 2.0 中使用数据集的 GroupByKey

Spark 数据集:示例:无法生成编码器问题