Загрузка таблиц BigQuery с больших pandas фреймов данных - PullRequest
1 голос
/ 29 марта 2020

Я пытаюсь загрузить относительно большой pandas фрейм данных df в таблицу Google BigQuery table_ref, используя официальную python google-cloud-bigquery клиентскую библиотеку.

Пока я попробовал два различные подходы:

1) загрузить таблицу непосредственно из фрейма данных в памяти

client = bigquery.Client()
client.load_table_from_dataframe(df, table_ref)

2) сохранить фрейм данных в файл паркета в Google Cloud Storage по адресу uri parquet_uri и загрузить таблица из этого файла:

df.to_parquet(parquet_uri)
client = bigquery.Client()
client.load_table_from_uri(parquet_uri, table_ref)

Оба подхода приводят к одной и той же ошибке:

google.api_core.exceptions.BadRequest: 400 Превышено ресурсов во время выполнения запроса: UDF из Память.; Не удалось прочитать файл Parquet [...]. Это может произойти, если файл содержит слишком большую строку или общий размер страниц, загруженных для запрашиваемых столбцов, слишком велик.

Фрейм данных df имеет 3 столбца и 184 миллион строк При сохранении в формате паркетного файла он занимает 1,64 ГБ.

Есть ли способ загрузить такой кадр данных в таблицу BigQuery, используя официальную клиентскую библиотеку python?

Заранее спасибо

Джованни

Ответы [ 2 ]

2 голосов
/ 29 марта 2020

, если ваш файл паркета уже загружен в Google Cloud Storage, вы можете загрузить его непосредственно в BigQuery без сценария python:

bq load \
--source_format=PARQUET \
dataset.table \
"gs://mybucket/00/*.parquet","gs://mybucket/01/*.parquet"

, где:

  • mybucket - это корзина, в которую вы загрузили файл паркета.
  • dataset.table - ваша таблица

Таким образом, BigQuery автоматически определяет схему.

BigQuery поддерживает следующие кодеки сжатия для блоков данных в файлах паркета:

  • Snappy GZip
  • LZO_1 C
  • LZO_1X

Вы можете прочитать больше по этой ссылке: https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-parquet

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

Я смог загрузить большой df в BigQuery, разделив его на несколько частей и загрузив каждый из них в таблицу в BigQuery, например:

client = bigquery.Client()
for df_chunk in np.array_split(df, 5):
    job_config = bigquery.LoadJobConfig()
    job_config.write_disposition = bigquery.WriteDisposition.WRITE_APPEND
    job = client.load_table_from_dataframe(df_chunk, table_id, job_config=job_config)
    job.result()

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