java - Spark SQL - 包含列表或数组作为元素的元组的编码器

标签 java apache-spark apache-spark-sql spark-dataframe

使用 Spark 2.2 + Java 1.8

我有两个自定义数据类型“Foo”和“Bar”。每个都实现可序列化。“Foo”与“Bar”具有一对多关系,因此它们的关系表示为一个元组:

Tuple2<Foo, List<Bar>>

通常,当我有 1:1 关系时,我可以像这样编码为我的自定义类型:

Encoder<Tuple2<Foo,Bar>> fooBarEncoder = Encoders.tuple(Encoders.bean(Foo.class),Encoders.bean(Bar.class));

然后用于编码我的数据集

Dataset<Tuple2<Foo,Bar>> fooBarSet = getSomeData().as(fooBarEncoder);

但是当我有一个列表(或数组)作为 Tuple2 元素时,我无法找到一种编码方案的方法。我希望能够为第二个元素提供编码器,如下所示:

Encoder<Tuple2<Foo,List<Bar>>> fooBarEncoder = Encoders.tuple(Encoders.bean(Foo.class), List<Bar>.class);

然后编码到我的数据集:

Dataset<Tuple2<Foo,List<Bar>>> fooBarSet = getSomeData().as(fooBarEncoder)

但显然我不能在像 List 这样的参数化类型上调用 .class

我知道对于 String 和原始类型,数组由 spark implicits 支持,例如:

sparkSession.implicits().newStringArrayEncoder()

但是我该如何为自定义类类型的列表或数组创建编码器呢?

最佳答案

我不确定此方法在您的设置中的实现效果如何,但可以。为您的列表创建一个包装器类并尝试一下。

public class BarList implements Serializable {
    List<Bar> list;

    public List<Bar> getList() {
        return list;
    }
    public void setList(List<Bar> l) {
        list = l;
    }
}

关于java - Spark SQL - 包含列表或数组作为元素的元组的编码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50126098/

相关文章:

java - MapStruct + Lombok 一起无法编译 : unknown property in result type

java - 返回一个使用最终原语的匿名类。它是如何工作的?

java - IntelliJ IDEA 14 构建项目正常,但在编辑器中显示很多错误

apache-spark - Web UI Spark 作业中的 ThreadPoolExecutor 作业是什么?

scala - 了解 UID 在 Spark MLLib Transformer 中的作用

apache-spark - 在 Spark Thrift 服务器中缓存 DataFrame

r - 用于大型数据集的 sparklyr 中 copy_to 的替代方案

java - Maven多模块项目中,如何指定多个模块需要的依赖?

linux - 超过命名空间配额时如何清空hadoop上的垃圾?

numpy - 用于触发数据框的大 numpy 数组