Запрос из динамического проекта + набор данных + названия таблиц Google BigQuery

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

Я решил создать таблицу, чтобы сохранить всю таблицу project.dataset.table, которую мне нужно запросить. Затем я мог бы выполнить запрос, где в "from" я мог бы взять местоположения из упомянутой таблицы.

Но на самом деле я не знаю, как это сделать. Или, если есть другое решение, которое я могу реализовать...

1 ответ

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

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

Например, если вы используете Python, то примерно что-то вроде этого:

import os
from google.cloud import bigquery

accounts = [
   {
      "account_name": "xyz", 
      "credentials_json": "/path/to/xyz/credentials.json", 
      "dataset_name": "dataset", 
      "table_name": "table_name"
   },
   {
      "account_name": "xyz", 
      "credentials_json": "/path/to/xyz/credentials.json", 
      "dataset_name": "dataset", 
      "table_name": "table_name"
   }
]

generic_query = '''
   select * from `{dataset_name}.{table_name}` where 1=1;
'''

def worker(account_info):
   '''
   your worker function which takes an account_info and runs the query.
   '''
   # set the credentials file env variable based on the account info
   os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = account_info.get("credentials_json")
   client = bigquery.Client()
   query = generic_query.format(dataset_name = account_info.get("dataset_name"), table_name = account_info.get("table_name"))
   query_job = client.query(query)
   rows = query_job.result()
   for row in rows:
      print(account_info.get("account_name"), row)
   return


if __name__ == "__main__":
   #--run through your accounts and submit to the worker
   while accounts:
      account_info = accounts.pop(0)
      worker(account_info)

Надеюсь, это поможет.

Другие вопросы по тегам