假设我们在BigQuery中有一个表,它的头类似于: id,_ name,_
在这个表中,大约有100万行。
而且,我们有一个具有100 K行的CSV文件,它具有相同的标题: id \ name _
但是: CSV中的几行具有与表中相同的id,而其他行具有新的id。
其任务是:将表中的行替换为来自CSV的新行,将其与id匹配,并将CSV中的行添加到新id中。
例如,表中的
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库吗?
发布于 2020-08-16 13:45:36
您可以使用以下步骤将数据更新为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()
https://stackoverflow.com/questions/58956618
复制相似问题