如何通过bq load命令仅向BigQuery上传CSV中的唯一行?
解决BigQuery通过bq load上传CSV时自动去重的问题
bq load命令本身没有直接实现仅上传唯一行的参数,不过可以通过两种方式实现你的需求:
方法一:在Cloud Shell中先预处理CSV去重
利用Linux的sort和uniq命令先对CSV文件去重,再上传处理后的文件。注意要单独保留表头,避免表头被排序或去重:
- 处理CSV文件,提取表头并对数据行去重:
# 提取第一行表头到新文件 head -n 1 your_file.csv > unique_employees.csv # 从第二行开始排序并去重,追加到新文件 tail -n +2 your_file.csv | sort | uniq >> unique_employees.csv
- 用bq load上传去重后的文件:
bq load --source_format=CSV \ your_project.your_dataset.your_table \ unique_employees.csv \ emp_id:INTEGER,emp_name:STRING
这种方式适合CSV文件较小的场景,提前在Cloud Shell环境完成去重。
方法二:先上传到临时表,再用BigQuery SQL去重
如果CSV文件较大,本地处理效率低,可以先把完整文件上传到临时表,再通过DISTINCT关键字生成去重后的正式表:
- 用bq load上传原始CSV到临时表:
bq load --source_format=CSV \ your_project.your_dataset.temp_employees \ your_file.csv \ emp_id:INTEGER,emp_name:STRING
- 执行SQL创建去重后的正式表:
bq query --use_legacy_sql=false " CREATE OR REPLACE TABLE your_project.your_dataset.target_employees AS SELECT DISTINCT * FROM your_project.your_dataset.temp_employees "
- (可选)删除临时表:
bq rm -f your_project.your_dataset.temp_employees
这种方式利用BigQuery的分布式处理能力,适合大文件去重场景。
内容的提问来源于stack exchange,提问作者Ajay
相关产品推荐
相关产品推荐

