我有一个模型类,看起来像这样:
@Getter
@Setter
@Builder // lombok
public class MyClass {
int id;
String name;
Set<String> hobbies;
}
字符串
我使用这个方法创建数据集:
MyClass myClassObj1 = MyClass.builder()
.id(1)
.name("Jack")
.hobbies(ImmutableSet.of("mountaineering", "cycling"))
.build();
MyClass myClassObj2 = MyClass.builder()
.id(2)
.name("Jill")
.hobbies(ImmutableSet.of("rhymes", "poetry"))
.build();
Dataset<MyClass> myClassDataset =
sparkSession.createDataset(
ImmutableList.of(myClassObj1, myClassObj2), Encoders.bean(MyClass.class));
型
然而,执行myClassDataset.show()
会给我一个空的hobbies属性,如下所示:
+----------+-------+---------+
|id |hobbies| name |
+----------+-------+---------+
| 1| {}|Jack |
| 2| {}|Jill |
+----------+-------+---------+
型myClassDataset.schema()
给出以下输出:
Seq(StructField(id,IntegerType,true), StructField(hobbies,Seq(),true), StructField(name,StringType,true))
型
不知道为什么hobbies列显示为空JSON?
1条答案
按热度按时间fykwrbwg1#
这可能是你的潜在解决方案。
Spark无法直接使用默认编码器处理复杂对象(如Set)。要解决这个问题,您需要实现一个自定义编码器来正确处理爱好集。
1.构建自定义编码器
字符串
2. show dataset
型
附录
对新问题的答复
问:这只会导致一列“值”,它的值是一些看似随机的ASCII字符。-
答:好的,这里还有一个
MyClass
实现接口Serializable和重写toString方法的方法,如下所示型
这里使用JSON框架slove JSON序列化,其他方法也可以。