假设在BigQuery中有一个表,其标题如下: id |名称|价格
并且在此表中大约有100万行。
而且,我们有一个csv文件,其中有10万行具有相同的标头:id |名称|价钱 CSV位于ftp服务器上。
但是:CSV中的几行具有与表中相同的ID,其他行具有新ID
任务是:通过匹配ID将表中的行替换为CSV中的新行, 并附加带有新ID的CSV行。
例如,在表中:
id | name | price
0, str0, 1000
1, str1, 1500
CSV格式:
id | name | price
0, str01, 1300
2, str2, 2500
更新后我们应该拥有
id | name | price
0, str01, 1300 (updated)
1, str1, 1500
2, str2, 2500 (new)
我可以使用google.cloud之类的Python库吗?
答案 0 :(得分:0)
您可以使用以下步骤将数据更新到BigQuery:
步骤1:将CSV文件复制到云存储
$ gsutil cp data.csv gs://demo-bucket-0816
第2步:创建表定义文件
$ bq mkdef --autodetect --source_format=CSV "gs://demo-bucket-0816/data.csv" > myschema
第3步:创建外部表
$ bq mk --external_table_definition=myschema bq_poc.ext_data
步骤4.1:使用BigQuery CLI合并语句
$ bq query --nouse_legacy_sql 'MERGE bq_poc.target_data td USING bq_poc.ext_data ed ON td.id = ed.id WHEN MATCHED THEN UPDATE SET price=ed.price WHEN NOT MATCHED THEN INSERT (id, name, price) VALUES(ed.id, ed.name, ed.price)'
步骤4.2:使用Python合并语句
from google.cloud import bigquery
mergeQuery = """MERGE bq_poc.target_data td
USING bq_poc.ext_data ed
ON td.id = ed.id
WHEN MATCHED THEN
UPDATE SET price=ed.price
WHEN NOT MATCHED THEN
INSERT (id, name, price) VALUES(ed.id, ed.name, ed.price)"""
bigqueryClient = bigquery.Client()
sqlJob = bigqueryClient.query(mergeQuery)
sqlJob.result()