BigQuery load_table_from_file无法加载90MB数据且无报错
问题排查与修复方案
一、代码中的致命问题
你的代码存在两处关键错误,直接导致异常被隐藏、加载逻辑失效:
- LoadJobConfig初始化语法错误:
source_format和autodetect不应在初始化后赋值,且参数间缺少逗号分隔,这会导致配置完全未生效。 - 异常捕获逻辑缺失:仅捕获了
load_table_from_file的异常且直接pass,完全忽略了job.result()阶段的加载错误;同时如果job创建失败,后续调用job.result()会引发未捕获的NameError。
二、修复后的代码
client = bigquery.Client('ncau-data-newsquery-sit') dataset_id = 'test_dataset' table_id = 'table' dataset_ref = client.dataset(dataset_id) table_ref = dataset_ref.table(table_id) # 修正JobConfig初始化方式 job_config = bigquery.LoadJobConfig( write_disposition=bigquery.WriteDisposition.WRITE_APPEND, source_format=bigquery.SourceFormat.NEWLINE_DELIMITED_JSON, autodetect=True ) with open(tempFile, "rb") as source_file: try: job = client.load_table_from_file(source_file, table_ref, job_config=job_config) # 将job.result()移入try块,捕获加载全流程异常 job.result() print(f"Loaded {job.output_rows} rows into {dataset_id}:{table_id}.") except Exception as e: # 打印具体异常信息,不再静默忽略 print(f"加载失败: {str(e)}") # 打印Job ID,方便去BigQuery控制台查详细日志 if 'job' in locals(): print(f"Job ID: {job.job_id}")
三、针对异常文件的排查步骤
- 验证NDJSON格式合法性:
- 使用
jq命令批量检查每行JSON:jq '.' your_file.jsonl,报错的行即为格式问题所在。 - 确认所有行都是独立的JSON对象,无跨行结构、多余逗号或括号。
- 使用
- 排查字段类型冲突:
- 由于开启
autodetect=True,若该月份数据中某字段类型与目标表已存在的字段类型不一致(比如之前是字符串,当前是数字),会触发加载失败。 - 可临时创建测试表单独加载该文件,对比自动生成的Schema与目标表Schema的差异。
- 由于开启
- 查看BigQuery Job日志:
- 登录BigQuery控制台进入「作业历史」,找到对应加载Job,查看详细错误信息(比如某行JSON解析失败、字段长度超限等)。
- 拆分文件定位问题:
- 将90MB的文件拆分为多个10MB左右的小文件分别加载,确认是整体文件问题还是特定行数据的问题。
内容的提问来源于stack exchange,提问作者Amarjeet Kushwaha
相关产品推荐
相关产品推荐

