Запрос из динамического проекта + набор данных + названия таблиц 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)
Надеюсь, это поможет.