Airflow中使用BigQueryInsertJobOperator的任务因“Set无法被JSON序列化”报错的排查咨询
解决BigQueryInsertJobOperator的JSON序列化错误及模板渗透问题
1. 错误的核心原因:destinationTable的写法意外生成了集合
你代码里的destinationTable: { some_dest_table.ref }是Python的集合语法,不是字典!在Python中,单元素的{x}写法会创建一个集合,而BigQueryInsertJobOperator的configuration要求destinationTable是符合API规范的字典结构——集合本身无法被JSON序列化,这就是你碰到TypeError: Object of type set is not JSON serializable的直接原因。
2. 修复destinationTable的正确写法
BigQuery的destinationTable需要包含projectId、datasetId、tableId三个字段的字典结构,你可以根据some_dest_table的类型调整写法:
- 如果
some_dest_table是Airflow的Table对象,直接提取它的属性构造字典:
some_task = BigQueryInsertJobOperator( task_id='some_task', configuration={ "query": { "query": "{% include 'sql/some_sql_script.sql' %}", "useLegacySql": False, }, "destinationTable": { "projectId": some_dest_table.project, "datasetId": some_dest_table.dataset_id, "tableId": some_dest_table.table_id } }, params={ 'some_param': some_param.ref, 'some_other_param': some_other_param.ref, 'yet_other_param': yet_other_param.ref } )
- 如果
some_dest_table.ref本身就是包含三个字段的字典,直接去掉外层大括号赋值即可:
"destinationTable": some_dest_table.ref # 不要加外层大括号!
3. 关于SQL模板中出现配置渗透的问题
这个问题大概率是集合错误引发的连锁反应:当Airflow尝试序列化畸形的configuration结构时,模板渲染过程出现解析异常,导致配置内容被错误插入到SQL中。修复集合问题后,这个渲染异常应该会自动消失。
如果修复后仍存在该问题,建议检查你的sql/some_sql_script.sql模板,确认里面没有意外引用{{ config }}这类Airflow内置变量(config会指向DAG或任务的配置信息)。
内容的提问来源于stack exchange,提问作者Dasph
相关产品推荐
相关产品推荐

