Spark неправильно преобразовывает набор данных в набор данных строки JSON - PullRequest
0 голосов
/ 24 апреля 2019

Я столкнулся со странным поведением Apache Spark.
Проблема в том, что я получаю неправильное представление JSON моего исходного набора данных при использовании метода toJson().
Чтобы объяснить проблему вболее подробно, представьте, что я набрал набор данных с этими полями:

SomeObject
(
   adtp 
   date
   deviceType
   ...
)

Затем я хочу отобразить элементы этого набора данных в JSON, используя метод toJson() (для хранения объектов в теме Кафки).
Но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=""
   ...
)

Можете ли вы помочь мне с этимпроблемы?Я пытался отладить работу с искрой, но это не простая задача (я не эксперт в Scala).

1 Ответ

0 голосов
/ 25 апреля 2019

Наконец-то я выяснил причину проблемы. У меня есть несколько 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...