Не удалось импортировать большие данные в виде фрейма данных из Google BigQuery в Google Cloud DataLab.

Я попробовал 2 подхода для импорта большой таблицы в Google BigQuery, около 50 000 000 строк, 18 ГБ, во фрейм данных в Google Datalab, чтобы выполнить машинное обучение с использованием Tensorflow.

Сначала использую (все необходимые модули импортируются):

data = bq.Query('SELECT {ABOUT_30_COLUMNS...} FROM `TABLE_NAME`').execute().result().to_dataframe()

Затем он хранится Running... до бесконечности. Хотя я делаю LIMIT 1000000, это не меняется.

Во-вторых использую:

data = pd.read_gbq(query='SELECT {ABOUT_30_COLUMNS...} FROM `TABLE_NAME` LIMIT 1000000', dialect ='standard', project_id='PROJECT_ID')

Сначала он работает хорошо, но когда он переходит примерно к 450000 строкам (рассчитывается с использованием процентного и общего количества строк), он застревает на:

Got page: 32; 45.0% done. Elapsed 293.1 s.

И я не могу найти, как включить allowLargeResults в read_gbq (). Как говорится в документе, я пытаюсь:

data = pd.read_gbq(query='SELECT {ABOUT_30_COLUMNS...} FROM `TABLE_NAME` LIMIT 1000000', dialect ='standard', project_id='PROJECT_ID', configuration = {'query': {'allowLargeResult': True}})

Тогда я получаю:

read_gbq() got an unexpected keyword argument 'configuration'

Вот почему мне даже не удалось импортировать 1 000 000 строк в Google Cloud Datalab. Я действительно хочу импортировать в 50 раз больше данных.

Есть идеи по этому поводу?

Спасибо


person Zrisound    schedule 02.07.2017    source источник


Ответы (1)


Перед загрузкой больших наборов данных в Google Cloud Datalab: обязательно рассмотрите альтернативы, такие как упомянутые в комментариях к этому ответу. Используйте выборочные данные для первоначального анализа, определите правильную модель проблемы, а затем используйте конвейерный подход, такой как Google Cloud Dataflow для обработки большого набора данных.

Есть интересное обсуждение улучшения производительности Datalab при загрузке данных из BigQuery в Datalab здесь. На основе этих тестов производительности улучшение производительности было объединено в Google Cloud Datalab в Pull Request # 339 . Это улучшение не упоминается в примечаниях к выпуску для Datalab, но я считаю, что исправления входят в состав Datalab 1.1.20170406. Проверьте версию Google Cloud Datalab, чтобы убедиться, что вы используете как минимум версию 1.1.20170406. Чтобы проверить версию, сначала нажмите значок пользователя в правом верхнем углу панели навигации в Cloud Datalab, затем нажмите О Datalab.

По поводу зависшей команды pandas.read_gbq(). Хочу предложить несколько предложений:

  1. Откройте новую проблему в pandas-gbq репозитории здесь.
  2. Попробуйте извлечь данные из BigQuery в Google Cloud Storage, например, в формате csv, которые затем можно загрузить во фрейм данных с помощью pd.read_csv. Вот 2 способа сделать это:

Использование инструментов командной строки Google BigQuery / Cloud Storage: использование bq инструмент командной строки и gsutil инструмент командной строки, извлечение данных из BigQuery в Google Cloud Storage, а затем Загрузите объект в Google Cloud Datalab. Для этого введите bq extract <source_table> <destination_uris>, а затем gsutil cp [LOCAL_OBJECT_LOCATION] gs://[DESTINATION_BUCKET_NAME]/

Использование Google Cloud Datalab

import google.datalab.bigquery as bq
import google.datalab.storage as storage
bq.Query(<your query>).execute(output_options=bq.QueryOutput.file(path='gs://<your_bucket>/<object name>', use_cache=False)).result()
result = storage.Bucket(<your_bucket>).object(<object name>).download()

Что касается ошибки read_gbq() got an unexpected keyword argument 'configuration', в версии 0.20.0 была добавлена ​​возможность передавать произвольные аргументы ключевого слова (configuration). Я считаю, что эта ошибка вызвана тем, что pandas устарело. Вы можете проверить версию установленных панд, запустив

import pandas
pandas.__version__

Для обновления до версии 0.20.0 запустите pip install --upgrade pandas pandas-gbq. При этом также будет установлена ​​pandas-gbq, которая является необязательной зависимостью для pandas.

В качестве альтернативы вы можете попробовать перебрать таблицу в Google Cloud Datalab. Это работает, но, вероятно, медленнее. Этот подход упоминался в другом ответе StackOverflow здесь: https://stackoverflow.com/a/43382995/5990514

Надеюсь, это поможет! Пожалуйста, дайте мне знать, если у вас возникнут проблемы, чтобы я мог улучшить этот ответ.

Антониос Парфениу

Автор Cloud Datalab

Сопровождающий проект на pandas-gbq

person Anthonios Partheniou    schedule 03.07.2017
comment
Я задаюсь вопросом, не лучше ли использовать datalab больше как записную книжку для быстрого анализа и глубокого исследования с выборочными данными, а не выводить 50 миллиардов строк за один раз. Для обработки этого большого количества данных потребуется некоторая структура кластера, я полагаю, я не уверен, сможет ли datalab обрабатывать или масштабировать ее для обработки (например, сначала работать с выборочными данными, находить правильную модель для проблемы, а затем использовать некоторый кластер для обрабатывать все данные). - person Willian Fuks; 03.07.2017
comment
@ Согласен. Это определенно то, о чем следует подумать пользователям. Пожалуйста, не стесняйтесь отправлять свой комментарий как отдельный ответ. По отдельности, если для анализа необходимы все строки, потенциально пользователи могут удалить ненужные столбцы, чтобы уменьшить общий размер набора данных. - person Anthonios Partheniou; 03.07.2017
comment
Я бы предпочел, чтобы вы обновили свой ответ этой информацией :), это уже достаточно хорошо, может быть, просто нужно предупредить OP о подходе к обработке выборочных данных, а затем перенести модели и выводы в кластер для дальнейшей обработки. - person Willian Fuks; 03.07.2017
comment
Обновлено. Спасибо @Will! - person Anthonios Partheniou; 03.07.2017