Загрузить огромные данные из фрейма данных dask в bigquery

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

У меня очень большой фрейм данных dask со 100 разделами и 57 столбцами. Я хочу переместить его в таблицу bigquery. Пока я пробовал 2 способа:

 dd.compute() # to do compute and then use pandas gbq
 pd.io.gbq.to_gbq(df, BQ_DATASET_NAME_TEMP + "." + BQ_EVENT_TEMP_TB, BQ_PROJECT_NAME, if_exists='append')

Это занимает так много времени (более 2 часов)

Я также пробовал использовать:

dd.to_json('gs://dask_poc/2018-04-18/output/data-*.json')

чтобы переместить фрейм данных dask в GCS, а затем переместить файлы в bigquery. Перемещение только фрейма данных в GCS занимает 3 часа. Просто подумал, что должен быть способ лучше. Есть мысли?


person MT467    schedule 14.03.2019    source источник
comment
Каков размер ваших данных? Что касается метода to_gbq, я думаю, что он не обрабатывает задание параллельно, так что это, вероятно, уже лучшая производительность, которую вы могли бы получить.   -  person Willian Fuks    schedule 14.03.2019
comment
@WillianFuks 40 миллионов строк, 57 столбцов   -  person MT467    schedule 14.03.2019


Ответы (1)


Ваш лучший формат для такого рода операций, скорее всего, паркет (df.to_parquet), а затем отправьте эти файлы. Вы можете попробовать использовать df.map_partitions для параллельной отправки частей с помощью to_gbq, но базовая процедура там медленная, и я не знаю, в какой степени BigQuery допускает одновременную запись блоков в таблицу.

person mdurant    schedule 16.03.2019
comment
Итак, выполните to_parquet для всего фрейма данных, а затем вызовите map_partitions или мне следует написать функцию, которая будет выполнять to_parquet и to_gbq вместе, а затем вызывать map_partitions? @mdurant - person MT467; 26.03.2019
comment
Делайте это как отдельные шаги, поскольку to_parquet не возвращает данные или байты, они создаются на диске / в сервисе хранения. - person mdurant; 26.03.2019