Чтение многострочного JSON с использованием потока данных Apache Beam / Google Cloud - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь прочитать файл JSON (многострочный) в конвейере, но beam.io.ReadFromText(somefile.json читает по одной строке за раз.

Я пытаюсь прочитать содержимое файла как JSON, чтобыЯ могу применить map к каждой категории для загрузки файла соответствующих продуктов.

Вот так выглядит мой JSON файл (productindex.json) :

{
  "productcategories" : {
    "category1" : {
      "productfile" : "http://products.somestore.com/category1/products.json"
    },
    "category2" : {
      "productfile" : "http://products.somestore.com/category2/products.json"
    },
    "category3" : {
      "productfile" : "http://products.somestore.com/category3/products.json"
    },
    "category4" : {
      "productfile" : "http://products.somestore.com/category4/products.json"
    }
}

Вот так выглядит начало моего конвейера:

with beam.Pipeline(options=pipeline_options) as p:
    rows = (
        p | beam.io.ReadFromText(
            "http://products.somestore.com/allproducts/productindex.json")
    )

Я использую модуль apache-beam[gcp].

Как мне этого добиться?

1 Ответ

0 голосов
/ 19 февраля 2019

Поток данных Apache Beam / Cloud напрямую не поддерживает чтение многострочных данных Json.

Основная причина в том, что это очень трудно сделать параллельно.Как Бим узнает, где заканчивается каждая запись?Это легко для одного читателя, но очень сложно для параллельных читателей.

Лучшее решение, которое я могу порекомендовать, - преобразовать ваши данные Json в Json (NDJSON) с разделителями строк перед обработкой в ​​Beam / Dataflow.Это может быть так же просто, как изменение выходного формата, записанного вышестоящей задачей, или может потребовать предварительной обработки.

...