Python Google BigQuery Paramaterized SELECT - PullRequest
0 голосов
/ 30 августа 2018

У меня проблема с параметризацией BigQuery. Я передаю дату начала и дату окончания функции вместе с массивом потенциальных полей, присутствующих в базе данных. Дата начала и окончания отформатирована как "ггггммдд".

Цель состоит в том, чтобы иметь возможность передавать набор дат и набор полей и собирать данные, относящиеся к массиву полей между двумя датами.

Дата операции работает как задумано.

Массив полей передается следующим образом: ["user_pseudo_id", "event_name", "event_timestamp"] в качестве примера (возможны другие записи в массиве)

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

Исходя из моего поиска, я считаю, что ArrayQueryParameter (вместо ScalarQueryParameter) решит проблему, но я не нашел много документации для использования.

query_job = client.query("""
    SELECT @search_params, _TABLE_SUFFIX AS suffix
    FROM `analytics_180354243.events_*` 
    WHERE REGEXP_EXTRACT(_TABLE_SUFFIX, r'[0-9]+')
    BETWEEN @start_date AND @end_date
    """, job_config=job_config)

ПОЛНАЯ ФУНКЦИЯ НИЖЕ

def query_awe(start_date, end_date, fields):
    credentials = service_account.Credentials.from_service_account_file('auth.json')

    project_id = 'my-project-id'

    client = bigquery.Client(credentials=credentials, project=project_id)

    search_params = ""

    for i in fields:
        search_params += i + ", "
    search_params = search_params[:-2]

    query_params = [
        bigquery.ScalarQueryParameter('start_date', 'STRING', start_date),
        bigquery.ScalarQueryParameter('end_date', 'STRING', end_date),
        bigquery.ScalarQueryParameter('search_params', 'STRING', search_params),

    ]
    bigquery.ArrayQueryParameter

    job_config = bigquery.QueryJobConfig()
    job_config.use_legacy_sql = False
    job_config.query_parameters = query_params

    query_job = client.query("""
        SELECT user_pseudo_id, event_name, _TABLE_SUFFIX AS suffix
        FROM `analytics_180354243.events_*` #Each day saved as events_yyyymmdd
        WHERE REGEXP_EXTRACT(_TABLE_SUFFIX, r'[0-9]+')
        BETWEEN @start_date AND @end_date
        ORDER BY user_pseudo_id DESC
        """, job_config=job_config)

    results = query_job.result()  # Waits for job to complete.

    for row in results:
        print(row)

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Как насчет использования строкового форматирования?

def query_awe(start_date, end_date, fields):
    credentials = service_account.Credentials.from_service_account_file('auth.json')

    project_id = 'my-project-id'

    client = bigquery.Client(credentials=credentials, project=project_id)

    job_config = bigquery.QueryJobConfig()
    job_config.use_legacy_sql = False

    my_query = """
        SELECT {0}, _TABLE_SUFFIX AS suffix
        FROM `analytics_180354243.events_*` #Each day saved as events_yyyymmdd
        WHERE REGEXP_EXTRACT(_TABLE_SUFFIX, r'[0-9]+')
        BETWEEN {1} AND {2}
        ORDER BY user_pseudo_id DESC
        """

    my_query = my_query.format(', '.join(fields), start_date, end_date)
    query_job = client.query(my_query, job_config=job_config)
    results = query_job.result()  # Waits for job to complete.

    for row in results:
        print(row)
0 голосов
/ 31 августа 2018

Я просто использую простую функцию замены, чтобы сделать то, что вы просите.

myQuery = """SELECT <var_search_params>, _TABLE_SUFFIX AS suffix
FROM `analytics_180354243.events_*` 
WHERE REGEXP_EXTRACT(_TABLE_SUFFIX, r'[0-9]+')
BETWEEN @start_date AND @end_date
"""
myQuery.replace("<var_search_params>", "Foo, Bar")

query_job = client.query(myQuery, job_config=job_config)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...