从 PySpark 查询远程 Hive Metastore

Posted

技术标签:

【中文标题】从 PySpark 查询远程 Hive Metastore【英文标题】:Query remote Hive Metastore from PySpark 【发布时间】:2020-09-27 18:10:02 【问题描述】:

我正在尝试使用用户名/密码/jdbc url 查询 PySpark 中的远程 Hive 元存储。我可以很好地初始化 SparkSession,但无法实际查询表。如果可能的话,我想把所有东西都保存在 python 环境中。有什么想法吗?

from pyspark.sql import SparkSession

url = f"jdbc:hive2://jdbcHostname:jdbcPort/jdbcDatabase"
driver = "org.apache.hive.jdbc.HiveDriver"

# initialize
spark = SparkSession \
    .builder \
    .appName("Python Spark SQL Hive integration example") \
    .config("hive.metastore.uris", url) \ # also tried .config("javax.jdo.option.ConnectionURL", url)
    .config("javax.jdo.option.ConnectionDriverName", driver) \
    .config("javax.jdo.option.ConnectionUserName", username) \
    .config("javax.jdo.option.ConnectionPassword", password) \
    .enableHiveSupport() \
    .getOrCreate()
# query
spark.sql("select * from database.tbl limit 100").show()
AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient;

在我能够使用 JDBC 连接到单个表但无法检索任何数据之前,请参阅 Errors querying Hive table from PySpark

【问题讨论】:

看起来您正在尝试查询 HiveServer,而不是 Metastore 本身。 Metastore 不会使用 HiveDriver,它会使用 mysql、Postgres、MSSQL、Derby 或 Oracle(每个都可以使用 sqlalchemy 而不是 Spark 进行查询),如果你想从 Spark 查询 HiveServer,你不会使用 JDBC 那我只需要更换驱动吗? 不太清楚您期望连接到什么。 Metastore 不会有任何实际存储在 Hive 中的数据,只有一堆关于 Hive 表的元数据 【参考方案1】:

Metastore uri 不是 JDBC 地址,它们只是 Metastore 服务器进程打开的 server:port 地址。通常是端口 9083

元存储本身不会是jdbc:hive2 连接,而是将配置元存储的相应 RDBMS(由 hive-site.xml 设置)

如果你想通过 JDBC 使用 Spark,那么你不需要那些 javax.jdo 选项,因为 JDBC 阅读器有自己的用户名、驱动程序等选项

【讨论】:

抱歉,Spark/Hive 的新手。我真的只是希望能够在 Python 环境中查询表,而不是每次都使用 DBeaver。使用我拥有的现有信息(网址/用户名/密码)执行此操作的最佳方法是什么? 如果您已经在 Spark 配置目录中配置了 hive-site.xml,那么您的 SparkSession 上的 enableHiveSupport() 就是您所需要的,那么spark.sql 将能够查询 HiveServer。您不需要 Metastore 访问权限 修改hive-site.xml 的替代方法是使用必要的配置选项构建SparkConf

以上是关于从 PySpark 查询远程 Hive Metastore的主要内容,如果未能解决你的问题,请参考以下文章

从 PySpark 查询 Hive 表时出错

无法使用 pyspark 从 hive 表中查询复杂的 SQL 语句

在 Hive 或 Pyspark 中查询以获取每个星期日和星期六的日期

将 sql server jar 添加到 pyspark 的类路径后无法查询 hive

PySpark 为语法正确的 Hive 查询抛出 ParseException

PySpark Hive 查询未显示输出