Импорт географических данных в BigQuery с помощью Avro / Parquet - PullRequest
0 голосов
/ 18 сентября 2018

В настоящее время я использую файлы Parquet для импорта данных в BigQuery (GIS). Один из файлов Parquet содержит столбец геометрии, представляющий данные геометрии в виде строки WKT (MultiPolygon), и я хочу импортировать этот столбец как тип GEOGRAPHY.

Q1. В документации упоминается, что автоматическое преобразование из WKT (строки) в GEOGRAPHY не поддерживается, так как я могу решить эту проблему? Я хочу избегать использования файлов CSV и предоставления определений схемы вручную.

Однако, даже если я сначала создаю пустую таблицу и хочу добавить только новый файл Parquet, он также не работает: Provided Schema does not match Table <org>-internal:test.<table>. Field geom has changed type from GEOGRAPHY to STRING.. (То же самое с Avro)

Q2. Есть ли возможность каким-либо образом принудительно привести столбец Паркет, содержащий строки WKT к типу GEOGRAPHY? Я не хочу сначала загружать временную таблицу, а затем выполнить запрос, который выполняет все преобразования, для загрузки целевой таблицы.

Обновление: При использовании клиента Python я могу указать схему вручную для файла Parquet, который я хочу импортировать. После завершения загрузки все значения в столбце GEOGRAPHY имеют значение INVALID. Тот же код отлично работает с CSV.

from google.cloud import bigquery

client = bigquery.Client(project='<project>')

table_ref = client.dataset('test').table('geometry')

job_config = bigquery.LoadJobConfig()
job_config.write_disposition = bigquery.WriteDisposition.WRITE_TRUNCATE
job_config.schema = [
    bigquery.SchemaField('id', 'INTEGER'),
    bigquery.SchemaField('geom', 'GEOGRAPHY'),
]

# CSV works fine!
# uri = 'gs://<bucket>/multipoly_sample.csv'
# job_config.source_format = bigquery.SourceFormat.CSV

# With Parquet, values in geom column are all "INVALID" 
uri = 'gs://<bucket>/multipoly_sample.parquet'
job_config.source_format = bigquery.SourceFormat.PARQUET

load_job = client.load_table_from_uri(
    uri,
    table_ref,
    job_config=job_config)
load_job.result()

1 Ответ

0 голосов
/ 25 сентября 2018

Это пока невозможно во время бета-тестирования ГИС.Он будет доступен до того, как BigQuery GIS перейдет в GA, но сейчас вы не можете загружать напрямую с помощью Parquet.Во время бета-тестирования вы можете загружать данные непосредственно в столбец Geography с помощью CSV, newline-delimited-JSON или API потоковой загрузки.

Обновление (30 октября 2018 г.): теперь это должно работать.Вы можете указать GEOGRAPHY в качестве типа столбца или загрузить в существующую таблицу со столбцом GEOGRAPHY.Столбец строки из Parquet / Avro будет проанализирован и преобразован в GEOGRAPHY.

...