【发布时间】:2018-05-17 00:40:40
【问题描述】:
使用 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
我知道对于字符串和原始类型,spark 隐式支持数组,例如:
sparkSession.implicits().newStringArrayEncoder()
但是如何为自定义类类型的列表或数组创建编码器?
【问题讨论】:
标签: java apache-spark apache-spark-sql spark-dataframe