Как записать массив строковых значений из Pandas в Google Big Query - PullRequest
2 голосов
/ 06 марта 2020

Я сейчас пытаюсь записать Pandas Dataframe (Python 3.x) в Google Big Query. В таблице есть столбец с объектом dtype, который содержит массив строковых значений.

образец pandas таблица Я стремлюсь создать таблицу BQ, которая поддерживает структуру вложенной таблицы, как показано ниже: образец таблицы Big Query со следующей схемой: схема таблицы Big Query

Я использую библиотеку google-cloud-bigquery , поскольку это позволяет df для преобразования в формат Parquet, который согласно документации поддерживает значения вложенного массива:

используемый код:

client = bigquery.Client()
table_id = 'dataset.table'

job_config = bigquery.LoadJobConfig(
    schema = [
            bigquery.SchemaField('route_id', 'INTEGER'),
            bigquery.SchemaField('types', 'STRING', mode='REPEATED')
    ], 
    writeDisposition="WRITE_APPEND"
)

job = client.load_table_from_dataframe(
    df, 
    table_id, 
    job_config=job_config,
)

# Wait for the load job to complete.
job.result()

но, к сожалению, я получаю следующее сообщение об ошибке:

BadRequest: 400 Ошибка при чтении данных, сообщение об ошибке: Предоставленная схема не совместима с файлом 'prod-scotty-76a528b c -407d-4224-8951-c8ff0c71faa1'. Поле 'types' указано как REPEATED в предоставленной схеме, которая не соответствует NULLABLE, как указано в файле.

Что было опробовано до сих пор:

  1. используется поле RECORD введите

, но это вызвало следующую ошибку: https://github.com/googleapis/python-bigquery/issues/21

вообще не отправляет никакую схему в python (и позволяет Python / BQ самостоятельно ее разбирать)

на удивление это работает для первой итерации (CREATE_IF_NEEDED), создающей таблицу в BQ, которая поддерживает вложенную структуру с автоматически применяемой следующей схемой: автоматически применяемая схема таблицы BQ , но не удается, если вы попытаетесь добавить даже точную таблицу снова, возвращая ту же ошибку, что и в пункте 1.

Любой совет или советы?

1 Ответ

0 голосов
/ 16 марта 2020

Кажется, что несоответствие между схемой в паркете и интерпретированной схемой для массивов при загрузке данных в BigQuery, которые еще не были разрешены.

Я не смог для правильной загрузки фрейма данных с массивом с использованием библиотеки с открытым исходным кодом pandas -gcp :

import pandas as pd
import pandas_gbq

d = {'nested_string': [['hi', 'keloke'], ['io', 'ready']], 'route_id': [83833, 4487]}
df = pd.DataFrame(data = d)

table_id = "dataset.table"
project_id = 'my_project'

pandas_gbq.to_gbq(
    df, table_id, project_id=project_id, if_exists='replace',
)

Другие возможные обходные пути без сторонних инструментов:

· Вместо этого используйте Dataflow

· Из файла python сохраните фрейм данных в виде CSV-файла в Google Storage Bucket и загрузите его из BigQuery

Как вы думаете, может ли это сработать для вы

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