Spark错误地将数据集转换为JSON字符串的数据集

时间:2019-04-24 12:22:36

标签: apache-spark

我遇到了Apache Spark的奇怪行为。
问题是,当我使用toJson()方法时,源数据集的JSON表示错误。
为了更详细地解释问题,假设我在以下字段中输入了数据集:

SomeObject
(
   adtp 
   date
   deviceType
   ...
)

然后我想使用toJson()方法将此数据集的元素映射到JSON(用于在Kafka主题中存储对象)。
但是,Spark无法正确地将此对象转换为其JSON表示形式。

您可以在屏幕截图上看到此行为:


enter image description here enter image description here


在使用toJson()之前,对象值是:

SomeObject
(
   adtp=1
   date="2019-04-24"
   deviceType="Mobile"
   ...
)

使用toJson()后,对象的值是:

SomeObject
(
   adtp=10
   date="Mobile"
   deviceType=""
   ...
)

您能帮我解决这类问题吗?我尝试调试spark作业,但这不是一件容易的事(我不是Scala的专家)。

1 个答案:

答案 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