PySpark读取BigQuery的__TABLES__系统表时报INTERNAL内部错误如何解决?
根因说明
2021年6月BigQuery侧对系统表的元数据访问接口做了兼容性调整,你使用的0.18.1版本spark-bigquery连接器针对系统表的元数据预请求格式不再适配新的接口规则,因此仅在查询__TABLES__这类系统表时报错,普通表查询不受影响。
解决方案
- 方案1:升级spark-bigquery连接器到0.21.0及以上版本,该版本已经修复了系统表查询兼容问题。注意依赖版本要和你环境的Scala版本匹配,Spark 3.x对应Scala 2.12的依赖包为
com.google.cloud.spark:spark-bigquery-with-dependencies_2.12:0.21.0,Spark 2.4.x对应Scala 2.11的依赖包为com.google.cloud.spark:spark-bigquery-with-dependencies_2.11:0.21.0 - 方案2:如果暂时无法升级连接器,可以改用SQL查询的方式绕开元数据预校验逻辑,代码示例如下:
spark.read.format('bigquery')\ .option("credentials", my_key)\ .option("project", 'my-parent-project') \ .option("query", "SELECT * FROM `my-dataset.__TABLES__`") \ .option("viewsEnabled", "true") \ .load()
该方案在0.18.1版本连接器下可正常返回__TABLES__的查询结果。
排查建议
- 先通过bq命令行工具执行
bq query "SELECT * FROM my-dataset.__TABLES__",确认当前使用的服务账号权限正常,排除权限变更导致的问题 - 确认服务账号被授予了数据集级的
bigquery.tables.list权限,该权限是查询__TABLES__系统表的必要权限,和普通表的读权限相互独立 - 开启Spark的DEBUG日志级别,可以拿到更详细的请求错误信息,方便定位具体异常点
内容的提问来源于stack exchange,提问作者Vzzarr
相关产品推荐
相关产品推荐

