Как обновить параметр в запросе (python + bigquery) - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь сделать несколько звонков, чтобы экспортировать большой набор данных из Bigquery в CSV через Python.(например, 0-10000-й ряд, 10001-й-20000-й ряд и т. д.).Но я не уверен, как правильно установить динамический параметр.т.е. постоянно обновлять a и b.

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

a = 0 
b = 10000

while a <= max(counts):     #i.e. counts = 7165920

    query = """
    SELECT *
    FROM `bigquery-public-data.ethereum_blockchain.blocks`
    limit @a, @b 
    """
    params = [
    bigquery.ScalarQueryParameter('a', 'INT', a),
    bigquery.ScalarQueryParameter('b', 'INT', b) ]

    query_job = client.query(query)
    export_file = open("output.csv","a")
    output = csv.writer(export_file, lineterminator='\n')
    for rows in query_job:
        output.writerow(rows)
    export_file.close()
    a = b +1
    b = b+b

Для небольшого размераНабор данных без использования цикла, я могу получить вывод без каких-либо параметров (я просто ограничить до 10, но это за один раз).Но когда я попробовал описанный выше метод, я продолжаю получать ошибки.

1 Ответ

0 голосов
/ 03 февраля 2019

Предложение другого подхода

Для экспорта таблицы

Поскольку вы хотите экспортировать все содержимое таблицы в формате CSV, я бы посоветовал вам использоватьВыдержкаОн предназначен для отправки содержимого таблицы в облачное хранилище Google в формате CSV или JSON.Вот хороший пример из документов:

destination_uri = 'gs://{}/{}'.format(bucket_name, 'shakespeare.csv')
dataset_ref = client.dataset(dataset_id, project=project)
table_ref = dataset_ref.table(table_id)

extract_job = client.extract_table(
    table_ref,
    destination_uri,
    # Location must match that of the source table.
    location='US')  # API request
extract_job.result()  # Waits for job to complete.

print('Exported {}:{}.{} to {}'.format(
    project, dataset_id, table_id, destination_uri))

Для запроса

Панды имеет функцию read_gbq длязагрузить результат запроса в DataFrame.Если результат запроса помещается в память, вы можете использовать это, а затем вызвать to_csv () для результирующего DataFrame.Для этого обязательно установите пакет pandas-gbq.

Если результат запроса слишком большой, добавьте место назначения в свой QueryJobConfig, чтобы он записывал в Google Cloud Storage.

Ответ наВаш вопрос

Вы могли бы просто использовать форматирование строки:

query = """
SELECT *
FROM `bigquery-public-data.ethereum_blockchain.blocks`
WHERE some_column = {}
LIMIT {}
"""

query_job = client.query(query.format(desired_value, number_lines))

(Это помещает требуемый_значение в WHERE и число_линей в LIMIT)

Если вы хотите использовать скалярПараметры запроса, вам нужно создать конфигурацию задания:

my_config = bigquery.job.QueryJobConfig()
my_config.query_parameters = params # this is the list of ScalarQueryParameter's
client.query(query, job_config=my_config)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...