Ответ зависит от этого.
TextIO
читает файлы построчно.Таким образом, в вашей test.json
каждая строка должна содержать отдельный объект Json.
Имеющиеся у вас ParDo
будут затем получать эти строки одну за другой, то есть каждый вызов @ProcessElement
получает одну строку.
Тогда в вашем ParDo
вы можете использовать что-то вроде Джексона ObjectMapper
для анализа Json с линии (или любого другого парсера Json, с которым вы знакомы, но Джексон широко используется, в том числе и в нескольких местах).Сам луч.
В целом подход к написанию ParDo
таков:
- получить
c.element()
; - сделать что-то со значением
c.element()
, например, парсинг его из json в объект java; - отправьте результат того, что вы сделали, на
c.element()
на c.output()
;
Я бы порекомендовал начать с просмотраРасширение Jackson для Beam SDK добавляет PTransforms
, чтобы сделать именно это, см. это и это .
Пожалуйста, взгляните также на this post, там есть несколько ссылок.
Также есть JsonToRow
transform , в котором вы можете искать похожие логиc, разница в том, что он не анализирует Json в определенный пользователем объект Java, а вместо этого в класс Beam Row.
Перед записью в BQ необходимо преобразовать объекты, которые вы проанализировали из Json, в BQстроки, которые будут еще ParDo
после вашей логики синтаксического анализа, а затем фактически применят BQIO в качестве еще одного шага.Вы можете увидеть несколько примеров в BQ test .