google-bigquery - 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})
这显然行不通,所以我想知道可以使用什么替代方法轻松更新我的表列?
解决方案
为此,您可以尝试使用 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链接。
推荐阅读
- java - 为什么我会收到 StackOverflowError: overriding ArrayList add 方法?
- android - 使用 Multidex 时找不到类异常
- java - 在 blob 变量中未接收到使用 xmlType 传递图像数据
- clojure - 如何结束 dotimes clojure
- git - 列出文件夹差异的 git 命令是什么
- javascript - 不要在 Mutation Handlers 之外改变 Vuex Store
- html - boostrap studio 跨列表单响应
- java - MVC 模式的逻辑太多?
- java - org.hibernate.hql.internal.QueryExecutionRequestException:不支持不使用休眠的 DML 操作
- html - 使用填充时隐藏一半的文本或数字