BigQuery: поле массива <string>с WriteToBigQuery - PullRequest
0 голосов
/ 04 декабря 2018

Я создаю шаблон потока данных Google в Python:

query = "#standardSQL" +  """
SELECT
  Frame.Serial,
  Frame.Fecha,
  Frame.Longitud,
  Frame.Latitud,
  ARRAY_AGG (CONCAT (ID, '-', Valor) ORDER BY ID) AS Resumen
FROM <...>


TABLE_SCHEMA = 'Serial:STRING,Fecha:DATETIME,Longitud:STRING,Latitud:STRING,Resumen:STRING'

| 'Read from BQ' >> beam.io.Read(beam.io.BigQuerySource(query=query,dataset="xxx",use_standard_sql=True))

| 'Write transform to BigQuery' >> WriteToBigQuery('table',TABLE_SCHEMA)

Проблема

Это не удается из-за поля Resumen является массивом:

Указан массив для неповторяющегося поля.


Что я тестировал

  1. Создать таблицу непосредственно в интерфейсе BigQuery с предложением:

    CREATE TABLE test (Resumen ARRAY<STRING>)

    Это работает.Таблица создается с помощью:

    • Тип: string
    • Режим: Repeated
  2. Измените TABLE_SCHEMA изапустить конвейер:

    TABLE_SCHEMA ='Serial:STRING,Fecha:DATETIME,Longitud:STRING,Latitud:STRING,Resumen:ARRAY<STRING>'

    С ошибкой:

    "Invalid value for: ARRAY\u003cSTRING\u003e is not a valid value".
    

Как и должно быть TABLE_SCHEMA досоздать таблицу и использовать с beam.io.WriteToBigQuery()?

1 Ответ

0 голосов
/ 04 декабря 2018

Похоже, что повторяющиеся или вложенные поля не поддерживаются, если вы указываете схему BQ в одной строке: https://beam.apache.org/documentation/io/built-in/google-bigquery/#creating-a-table-schema

Вам нужно будет явно описать вашу схему и установить режим поля на repeated:https://github.com/apache/beam/blob/master/sdks/python/apache_beam/examples/cookbook/bigquery_schema.py#L95

# A repeated field.
children_schema = bigquery.TableFieldSchema()
children_schema.name = 'children'
children_schema.type = 'string'
children_schema.mode = 'repeated'
table_schema.fields.append(children_schema)
...