Han*_*ber 6 java apache-spark apache-spark-sql spark-dataframe
使用Spark 2.2 + Java 1.8
我有两个自定义数据类型"Foo"和"Bar".每个都实现serializable.'Foo'与'Bar'有一对多的关系,所以他们的关系表示为元组:
Tuple2<Foo, List<Bar>>
Run Code Online (Sandbox Code Playgroud)
通常,当我有1:1的关系时,我可以编码为我的自定义类型,如下所示:
Encoder<Tuple2<Foo,Bar>> fooBarEncoder = Encoders.tuple(Encoders.bean(Foo.class),Encoders.bean(Bar.class));
Run Code Online (Sandbox Code Playgroud)
然后用来编码我的数据集
Dataset<Tuple2<Foo,Bar>> fooBarSet = getSomeData().as(fooBarEncoder);
Run Code Online (Sandbox Code Playgroud)
但是当我将列表(或数组)作为Tuple2元素时,我很难找到编码方案的方法.我希望能够为第二个元素提供一个编码器,如下所示:
Encoder<Tuple2<Foo,List<Bar>>> fooBarEncoder = Encoders.tuple(Encoders.bean(Foo.class), List<Bar>.class);
Run Code Online (Sandbox Code Playgroud)
然后编码到我的数据集:
Dataset<Tuple2<Foo,List<Bar>>> fooBarSet = getSomeData().as(fooBarEncoder)
Run Code Online (Sandbox Code Playgroud)
但显然我无法在像List这样的参数化类型上调用.class
我知道对于String和基本类型,数组由spark implicits支持,例如:
sparkSession.implicits().newStringArrayEncoder()
Run Code Online (Sandbox Code Playgroud)
但是,如何为自定义类类型的List或Array创建编码器?
小智 3
我不确定此方法在您的设置中的实施效果如何,但这里是。为您的列表创建一个包装类并尝试一下。
public class BarList implements Serializable {
List<Bar> list;
public List<Bar> getList() {
return list;
}
public void setList(List<Bar> l) {
list = l;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1976 次 |
| 最近记录: |