如何使用基于自定义参数的表名中类似于 python 的字符串格式查询谷歌数据工作室中的 bigquery 表?

Posted

技术标签:

【中文标题】如何使用基于自定义参数的表名中类似于 python 的字符串格式查询谷歌数据工作室中的 bigquery 表?【英文标题】:How to query bigquery tables in google data studio with python-like string formatting in table names based on custom parameters? 【发布时间】:2020-10-21 19:23:11 【问题描述】:

因此,我每年都有几张表格,其中包含每种产品的表格,表格如下: 2020product5, 2019product5, 2018product6 等等。我在 google data studio 中添加了两个自定义参数,命名为 year 和 product_id,但不能在表名中使用它们。我之前使用过参数化查询,但在where product_id = @product_id 等条件下使用,但此设置仅在所有数据都在同一个表中时才有效,这不是我当前的情况。在python中,我使用f"yearproductproduct_id"之类的字符串格式化程序,但这显然在这种情况下不起作用...... 使用 Bigquery 默认 CONCAT 和 FORMAT 函数无济于事,因为两者都会引发以下验证错误:Table-valued function not found: CONCAT at [1:15]

那么,如何在 google Data Studio 中使用基于自定义参数的表名中类似 python 的字符串格式查询 bigquery 表?

【问题讨论】:

这可能与以下内容重复:***.com/questions/51475252/… 不,这不是。它仅涵盖表后缀部分,这是我正在使用的当前工作,正如我在下面的回答中提到的那样。我的问题是关于动态选择彼此不同的表。不仅仅是后缀,实际上是一个由后缀分区的表。 【参考方案1】:

经过大量研究,我(有点)整理出来了。原来它是查询模式级实体的数据库级功能,例如动态表名。 BigQuery 不支持表名中的格式设置,如问题中的表(例如2020product52019product52018product6)无法直接查询。但是,它确实有一个 TABLE_SUFFIX 函数,允许您动态访问表,因为表名的更改位于表的末尾。 (此功能还允许进行 dateweise 分区和许多使用 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.yearproductproduct_id`
            """).result().to_dataframe()
    df.to_gbq(project_id = project_id,
                destination_table = f'schema.productproduct_idyear',
                credentials = service_account.Credentials.from_service_account_file(
                    'credentials.json'),
                if_exists = 'replace')
    client.query(f"""
            DROP TABLE `project_id.schema.yearproductproduct_id`""").result()

【讨论】:

以上是关于如何使用基于自定义参数的表名中类似于 python 的字符串格式查询谷歌数据工作室中的 bigquery 表?的主要内容,如果未能解决你的问题,请参考以下文章

mysql 从动态表名中查询数据

在 MySQL 的表名中使用点是一种好习惯吗

从Django中的表名中查找模型实例

我已经为从我的表名中获取记录编写了这段代码是所有者...但是发生了一些错误...是不是缺少某些东西?

如何自定义与 EDMX(模型优先)实体框架 4.1 一起使用的表名?

通过在 Sql 中使用表名中的特定单词检查表是不是存在