Загрузите огромные данные из BigQuery в python / pandas / dask - PullRequest
3 голосов
/ 07 марта 2019

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

У меня есть большая большая таблица в BigQuery (предположим, вставка 20 миллионов строк в день).Я хочу иметь около 20 миллионов строк данных и около 50 столбцов в python / pandas / dask для некоторого анализа.Я попытался использовать методы API-хранилищ bqclient, panda-gbq и bq, но для того, чтобы в Python было 5 миллионов строк, требуется 30 минут.Есть ли другой способ сделать это?Даже какой-нибудь сервис Google, который может сделать подобную работу?

Ответы [ 4 ]

2 голосов
/ 07 марта 2019

Вместо запросов вы всегда можете экспортировать вещи в облачное хранилище -> локально скачать -> загрузить в свой фрейм данных dask / pandas:

  1. Экспорт + Загрузка:

    bq --location=US extract --destination_format=CSV --print_header=false 'dataset.tablename' gs://mystoragebucket/data-*.csv &&  gsutil -m cp gs://mystoragebucket/data-*.csv /my/local/dir/ 
    
  2. Загрузка в Dask:

    >>> import dask.dataframe as dd
    >>> df = dd.read_csv("/my/local/dir/*.csv")
    

Надеюсь, это поможет.

1 голос
/ 07 марта 2019

Во-первых, вы должны профилировать свой код, чтобы узнать, что занимает время.Это просто ожидание большого запроса для обработки вашего запроса?Это загрузка данных> Какова ваша пропускная способность, какую долю вы используете?Это анализ этих данных в памяти?

Поскольку вы можете заставить SQLAlchemy поддерживать большой запрос (https://github.com/mxmzdlv/pybigquery), вы можете попробовать использовать dask.dataframe.read_sql_table, чтобы разбить ваш запрос на разделы и загрузить /обрабатывать их параллельно.В случае, если большой запрос ограничивает пропускную способность для одного соединения или для одного компьютера, вы можете получить намного лучшую пропускную способность, запустив это в распределенном кластере.

Эксперимент!

1 голос
/ 07 марта 2019

Некоторые опции:

  • Попробуйте выполнить агрегацию и т. Д. В BigQuery SQL перед экспортом (таблица меньшего размера) в Панды.
  • Запустите свой ноутбук Jupyter в Google Cloud, используя виртуальную виртуальную машину Deep Learning на компьютере с большим объемом памяти в том же регионе, что и BigQuery. набор данных. Таким образом, нагрузка на сеть минимизируется.
0 голосов
/ 07 марта 2019

Возможно, вы сначала хотите экспортировать данные в Google Cloud Storage, а затем загрузить данные на локальный компьютер и загрузить их. Вот шаги, которые нужно предпринять:

  • Создайте промежуточную таблицу, которая будет содержать данные, которые вы хотите экспорт. Вы можете выбрать и сохранить в промежуточной таблице.
  • Экспорт промежуточной таблицы в Google Cloud Storage в формат JSON / Avro / Parquet.
  • Загрузите экспортированные данные и загрузите в приложение Python.

Помимо загрузки данных на локальный компьютер, вы можете использовать обработку, используя PySpark и SparkSQL. После экспорта данных в Google Cloud Storage вы можете раскрутить кластер Cloud Dataproc, загрузить данные из Google Cloud Storage в Spark и выполнить там анализ.

Пример вы можете прочитать здесь

https://cloud.google.com/dataproc/docs/tutorials/bigquery-connector-spark-example

и вы также можете раскрутить Jupyter Notebook в кластере Dataproc

https://cloud.google.com/dataproc/docs/tutorials/jupyter-notebook

Надеюсь, это поможет.

...