Collection属性在spark中编码为空JSON

uyhoqukh  于 2023-08-06  发布在  Apache
关注(0)|答案(1)|浏览(120)

我有一个模型类,看起来像这样:

@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?

fykwrbwg

fykwrbwg1#

这可能是你的潜在解决方案。
Spark无法直接使用默认编码器处理复杂对象(如Set)。要解决这个问题,您需要实现一个自定义编码器来正确处理爱好集。

1.构建自定义编码器

public class MyClassEncoder {
    public static ExpressionEncoder<MyClass> encoder() {
        return Encoders.bean(MyClass.class);
    }

    public static Encoder<MyClass> customEncoder() {
        return Encoders.kryo(MyClass.class);
    }
}

字符串

2. show dataset

Dataset<MyClass> myClassDataset = sparkSession.createDataset(
                ImmutableList.of(myClassObj1, myClassObj2), MyClassEncoder.customEncoder());

附录

对新问题的答复
问:这只会导致一列“值”,它的值是一些看似随机的ASCII字符。-
答:好的,这里还有一个MyClass实现接口Serializable和重写toString方法的方法,如下所示

public String toString() {
        return "MyClass{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", hobbies=" + hobbies +  // here is json serialize sample 
                '}';
    }


这里使用JSON框架slove JSON序列化,其他方法也可以。

相关问题