Как запрашивать таблицы bigquery в студии данных Google с форматированием строк в стиле python в именах таблиц на основе пользовательских параметров?

Итак, у меня есть несколько таблиц с каждым продуктом на каждый год, и таблицы выглядят так: 2020product5, 2019product5, 2018product6 и так далее. Я добавил два пользовательских параметра в студию данных Google, а также назвал год и product_id, но не смог использовать их в самих именах таблиц. Раньше я использовал параметризованные запросы, но в таких условиях, как where product_id = @product_id, но эта настройка работает только в том случае, если все данные находятся в одной таблице, что не относится к моему текущему случаю. В python я использую средства форматирования строк, такие как f"{year}product{product_id}", но в данном случае это явно не работает... Использование Bigquery по умолчанию CONCAT и ФОРМАТ a> не помогает, так как обе выдают следующую ошибку проверки: Table-valued function not found: CONCAT at [1:15]

Итак, как мне обходиться с запросами таблиц bigquery в студии данных Google с форматированием строк в стиле Python в именах таблиц на основе пользовательских параметров?


person Hamza    schedule 21.10.2020    source источник
comment
Это возможный дубликат: stackoverflow.com/questions/51475252/   -  person Bernhardt Scherer    schedule 29.06.2021
comment
Нет, это не так. Он охватывает только часть суффиксов таблиц, которая является текущей работой, которую я использую, как я уже упоминал в своем ответе ниже. Мой вопрос касается динамического выбора таблиц, которые отличаются друг от друга. Больше отличается от простых суффиксов, которые на самом деле представляют собой единую таблицу, разделенную суффиксами.   -  person Hamza    schedule 29.06.2021


Ответы (1)


После долгих исследований я (вроде) разобрался. Оказывается, это функция уровня базы данных для запроса объектов уровня схемы, например. имена таблиц динамически. BigQuery не поддерживает форматирование в имени таблицы, например, таблицы в соответствии с вопросом (например, 2020product5, 2019product5, 2018product6) не могут быть запрошены напрямую. Однако у него есть функция TABLE_SUFFIX, которая позволяет вам динамически обращаться к таблицам, учитывая, что изменения в именах таблиц расположены в конце таблицы. (Эта функция также позволяла разбивать даты, и многие инструменты, которые используют BQ в качестве приемника данных, используют это. Поэтому, если вы используете BQ в качестве приемника данных, есть большая вероятность, что ваш исходный источник данных уже делает это). Таким образом, имена таблиц, такие как (product52020, product52019, product62018), также могут быть доступны динамически и, конечно же, из студии данных, используя следующее:

SELECT * FROM `project_salsa_101.dashboards.product*` WHERE _table_Suffix = CONCAT(@product_id,@year) 

P.S.: Использовал python для создания грязного скрипта, который зацикливался на продуктах и ​​таблицах, копировал и создавал новые, который выглядит следующим образом: (Добавление скрипта с отформатированной строкой, так что это может быть полезно для тех, у кого такой случай с номинальными усилиями)

import itertools
credentials = service_account.Credentials.from_service_account_file(
    'project_salsa_101-bq-admin.json')
project_id = 'project_salsa_101'
schema = 'dashboards'
client = bigquery.Client(credentials= credentials,project=project_id)

for product_id, year in in itertools.product(product_ids, years): 
    df = client.query(f"""
            SELECT *  FROM `{project_id}.{schema}.{year}product{product_id}`
            """).result().to_dataframe()
    df.to_gbq(project_id = project_id,
                destination_table = f'{schema}.product{product_id}{year}',
                credentials = service_account.Credentials.from_service_account_file(
                    'credentials.json'),
                if_exists = 'replace')
    client.query(f"""
            DROP TABLE `{project_id}.{schema}.{year}product{product_id}`""").result()
person Hamza    schedule 24.10.2020