У меня проблема с параметризацией 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)