我遇到了Apache Spark
的奇怪行为。
问题是,当我使用toJson()
方法时,源数据集的JSON表示错误。
为了更详细地解释问题,假设我在以下字段中输入了数据集:
SomeObject
(
adtp
date
deviceType
...
)
然后我想使用toJson()
方法将此数据集的元素映射到JSON(用于在Kafka主题中存储对象)。
但是,Spark无法正确地将此对象转换为其JSON表示形式。
您可以在屏幕截图上看到此行为:
在使用toJson()
之前,对象值是:
SomeObject
(
adtp=1
date="2019-04-24"
deviceType="Mobile"
...
)
使用toJson()
后,对象的值是:
SomeObject
(
adtp=10
date="Mobile"
deviceType=""
...
)
您能帮我解决这类问题吗?我尝试调试spark作业,但这不是一件容易的事(我不是Scala的专家)。
答案 0 :(得分:0)
最后,我找出了问题的原因。我在数据转换中加入了一些JOIN,然后设置了数据集的类型(使用as(...)
)。
但是问题在于,键入后,Spark不会更改数据集的内部架构。
而且这些架构(源数据集之一和数据模型类之一)可能有所不同。不仅取决于列的存在,而且取决于它们的顺序。
因此,在将源数据集转换为JSON数据集时,Spark只是采用JOIN之后剩余的模式,并在转换为JSON时使用它。这就是错误的toJson()
转换的原因。
因此解决方案非常简单。只需使用转换数据集功能之一(以map(...)
为例)即可显式更新数据集架构。因此,在我看来,它看起来很糟糕,但最重要的是它可以正常工作:
.as(Encoders.bean(SomeObject.class))
.map(
(MapFunction<SomeObject, SomeObject>) obj -> obj,
Encoders.bean(SomeObject.class)
);
此问题上还有一张票证:SPARK-17694。