首页 > 解决方案 > Big Query:如何使用带列名的变量和循环

问题描述

我正在尝试使用循环来更新 Bigquery 中的表。我的表结构如下(有 100 列和数千行):

日期 期间1 期间2 期间3 期间4 期间5 期间6 时期... PERIOD100
2021-01-01
2021-02-01

对于每个日期,我需要使用循环来填充值,例如

---
DECLARE VAR_PERIOD INT64 DEFAULT 1
LOOP
IF PERIOD > 100 THEN LEAVE;
END IF;
---
update `mydataset.mytable` set CONCAT('PERIOD',VAR_PERIOD) = (select{+my query})

这显然行不通,所以我想知道可以使用什么替代方法轻松更新我的表列?

标签: google-bigquerydml

解决方案


为此,您可以尝试使用 BigQuery API 客户端库链接。有更多可用的语言,但我在这里使用 python。您可以直接在 cloud shell 中启动。在那里你可以编写一个 Python 程序来完成你的工作。

关于您的要求,我有一些假设:您想使用 SELECT 子句来获取一些值,并使用它来更新 Period 列的值。

from google.cloud import bigquery

''' Construct a BigQuery client object. '''
client = bigquery.Client()

query = """
    select col_name from `projectID.dataset.table`
    where condition
"""

''' Make an API request. '''
query_job = client.query(query) 

''' Store the value of query result in some variable (value). '''
for row in query_job:
    value = row[0]


'''  
Creating the query to update the columns using the value.
 
UPADTE `projectID.dataset.table`
SET Period1 = Period1 + value, Period2 = Period2 + value ...
where condition
'''

query = "UPDATE `projectID.dataset.table`  SET "

for i in range(1,101):
    query += 'period'+str(i)+' = ' + 'period'+ str(i) + ' + ' +str(value) +','

query = query[0:-1]
query += ' WHERE condition'

''' Make an API request. '''
query_job = client.query(query)

所有 BigQuery 更新语句都必须有 WHERE 子句。如果您想更新所有行而不是 WHERE 条件中提及 TRUE链接


推荐阅读