Как перебрать результаты запроса BigQuery и записать его в файл - PullRequest
0 голосов
/ 14 мая 2019

Мне нужно запросить таблицу Google BigQuery и экспортировать результаты в файл GZIP.Это мой текущий код.Требование состоит в том, что данные каждой строки должны быть удалены (\ n) с новой строки.

def batch_job_handler(args):

    credentials = Credentials.from_service_account_info(service_account_info)

    client = Client(project=service_account_info.get("project_id"),
                    credentials=credentials)

    query_job = client.query(QUERY_STRING)

    results = query_job.result()  # Result's total_rows is 1300000 records

    with gzip.open("data/query_result.json.gz", "wb") as file:
        data = ""
        for res in results:
            data += json.dumps(dict(list(res.items()))) + "\n"
            break
        file.write(bytes(data, encoding="utf-8"))

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

Это из-за этой строки: json.dumps(dict(list(res.items()))) + "\n", поскольку я строю огромную строку, объединяя каждую запись новой строкой.

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

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Ознакомьтесь с новым API хранилища BigQuery для быстрого чтения:

Пример работы API приведен в этом проекте:

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

  • Прямая передача

Не оставляет никаких временных файлов в облачном хранилище Google.Строки считываются непосредственно с серверов BigQuery с использованием проводного формата Avro.

  • Фильтрация

Новый API позволяет фильтровать столбцы и ограниченные предикаты только для чтения интересующих вас данных..

  • Фильтрация столбцов

Поскольку BigQuery поддерживается столбчатым хранилищем данных, он может эффективно передавать данные без чтения всех столбцов.

  • ПредикатФильтрация

Storage API поддерживает ограниченное нажатие фильтров предикатов.Он поддерживает одно сравнение с литералом

0 голосов
/ 14 мая 2019

Вам следует (в большинстве случаев) направить выходные данные из запроса BigQuery во временную таблицу и экспортировать эту временную таблицу в Google Cloud Storage Bucket. Из этого ведра вы можете загружать вещи локально. Это самый быстрый маршрут для получения результатов на местном уровне. Все остальное будет мучительно медленным, особенно итерация результатов, поскольку BQ не предназначен для этого.

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