服务端向BigQuery加载表时报bytes类型无法JSON序列化错误
问题成因
该报错在本地运行正常、服务端触发的核心原因来自三类环境差异:
- 谷歌凭据文件异常:你上传服务端的
google_credentials.json文件可能因传输编码错误、存储格式异常导致读取时返回bytes类型内容,谷歌云SDK解析JSON时仅支持字符串输入,进而触发序列化错误。 - MySQL连接配置差异:Linux服务端的mysql-connector默认配置与Windows不同,默认未开启unicode转换,若SQL查询涉及CHAR/VARCHAR/BLOB类型字段,返回结果会以bytes格式存入DataFrame,BigQuery导入环节无法序列化bytes类型值。
- 依赖版本不匹配:服务端的
google-cloud-bigquery、pandas、mysql-connector-python版本低于本地环境,低版本组件未兼容bytes类型字段的自动转码逻辑。
解决方案
按照优先级依次执行以下操作即可解决:
- 校验凭据文件:登录服务端执行
cat /root/google_credentials.json,确认输出为正常明文JSON格式,若为乱码重新上传正确的凭据文件,上传时选择文本传输模式,确保运行代码的用户对该文件有可读权限。 - 修正MySQL连接参数:给mysql连接配置新增编码和unicode参数,强制返回字符串类型结果:
mydb = mysql.connector.connect( host='host', user='1111', password='password', database="my_database", charset='utf8mb4', use_unicode=True )
- 主动转码DataFrame字段:如果修改连接配置后仍报错,在DataFrame生成后新增bytes转字符串逻辑:
# 遍历所有列,将bytes类型值转为utf-8字符串 for col in df.columns: if df[col].dtype == object: df[col] = df[col].apply(lambda x: x.decode('utf-8') if isinstance(x, bytes) else x)
- 统一依赖版本:将服务端相关依赖升级到和本地一致的版本,执行命令:
pip install --upgrade google-cloud-bigquery pandas pyarrow mysql-connector-python
内容的提问来源于stack exchange,提问作者Bushmaster
相关产品推荐
相关产品推荐

