如何使用基于自定义参数的表名中类似于 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 不支持表名中的格式设置,如问题中的表(例如2020product5
、2019product5
、2018product6
)无法直接查询。但是,它确实有一个 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 表?的主要内容,如果未能解决你的问题,请参考以下文章
我已经为从我的表名中获取记录编写了这段代码是所有者...但是发生了一些错误...是不是缺少某些东西?