如何使用Python从本地CSV文件直接加载数据到BigQuery表
问题根因
load_table_from_uri()方法仅支持加载可通过云内URI寻址的数据源(如Google Cloud Storage对象、BigQuery内置数据集路径),无法直接读取本地文件系统上的文件,你当前代码传入本地路径bigquery-demo/csv_data.csv会被判定为无效资源地址,导致加载作业失败。
本地CSV直传BigQuery实现
不需要经过云存储中转,直接使用BigQuery Python客户端的load_table_from_file()方法,传入打开的本地文件对象即可完成加载,完整可运行代码如下:
from google.cloud import bigquery from google.cloud.exceptions import NotFound # 提前配置好鉴权:设置环境变量GOOGLE_APPLICATION_CREDENTIALS指向服务账号密钥文件 client = bigquery.Client() # 替换为你的目标表ID,格式为「项目ID.数据集名称.表名称」 table_id = "your-project.your-dataset.your-table" local_csv_file = "bigquery-demo/csv_data.csv" # 检查目标表是否已存在 try: client.get_table(table_id) print("Table {} already exists.".format(table_id)) except NotFound: print("Table {} is not found.".format(table_id)) # 加载作业配置,和你原有配置保持一致 job_config = bigquery.LoadJobConfig( autodetect=True, skip_leading_rows=1, source_format=bigquery.SourceFormat.CSV, ) # 核心修改:以二进制读模式打开本地CSV文件,调用文件上传接口 with open(local_csv_file, "rb") as f: load_job = client.load_table_from_file( f, table_id, job_config=job_config ) # 阻塞等待作业执行完成 load_job.result() # 打印加载结果 destination_table = client.get_table(table_id) print("Loaded {} rows.".format(destination_table.num_rows))
注意事项
- 运行脚本前必须完成鉴权配置:将拥有目标BigQuery数据集写入权限的服务账号密钥下载到本地,设置环境变量
GOOGLE_APPLICATION_CREDENTIALS为该密钥文件的本地绝对路径 - 该直传方式支持的单文件大小上限为10MB,如果你的CSV文件超过该阈值,需要拆分文件分批上传,或走云存储中转流程
- 配置
autodetect=True时,如果目标表不存在,BigQuery会自动根据CSV内容推断字段类型完成建表,不需要提前手动创建表结构

内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

