PySpark通过JDBC连接Hive读取表返回所有行均为列名问题求助
问题原因
你遇到的查询返回所有行均为列名的问题,是Hive JDBC驱动与Spark JDBC数据源配置不兼容导致的,核心冲突点是UseNativeQuery参数的取值设置。
直接修复方案
两种方案二选一即可:
- 删掉
UseNativeQuery配置项,调整查询参数:
该参数不是Hive JDBC对接Spark的必选配置,删除后直接指定要查询的表名或者子查询即可正常读取数据,修改后的代码示例:qryStr = """(SELECT * FROM table_name) as t""" df_channel = spark.read.format('jdbc')\ .option('url',sqlsUrl)\ .option('dbtable', qryStr )\ .option("user", "{username}") \ .option("password", "{passw}") \ .load() - 保留原生查询能力,修改参数取值为字符串类型的布尔值:
部分版本的Hive JDBC驱动无法识别数字类型的布尔值参数,将option('UseNativeQuery', 1)修改为option('UseNativeQuery', "true")即可解决解析异常。
更优使用方案
你初始化SparkSession时已经调用了enableHiveSupport(),只要将集群的hive-site.xml配置文件放到Spark安装目录的conf文件夹下,完全不需要走JDBC协议连接Hive,直接使用Spark原生Hive支持读取,性能更高且不会出现JDBC兼容问题,示例代码:
# 无需额外配置JDBC参数,直接执行SQL即可 df_channel = spark.sql("SELECT * FROM table_name")
异常排查点
如果修改配置后问题仍存在,可以优先检查两个项:
- Hive JDBC驱动包的大版本是否和服务端Hive版本一致,版本不匹配会导致各种数据解析异常
- 连接账号是否拥有目标表的查询权限,部分低版本Hive在权限不足时会返回异常结果
内容的提问来源于stack exchange,提问作者Ikhlasul Amal
相关产品推荐
相关产品推荐

