如何使用 Databricks 查询外部 Hive 表

Posted

技术标签:

【中文标题】如何使用 Databricks 查询外部 Hive 表【英文标题】:How Can I Query an External Hive Table Using Databricks 【发布时间】:2020-04-16 10:18:05 【问题描述】:

我有一个在一些虚拟机上运行的 Databricks 集群。我的组织有一个 Hadoop 集群,其中包含我想要的一堆数据。我无法访问 Hadoop 集群,只有一个 JDBC URL(我的所有权限都已整理,他们只给了我一个 URL)。

我可以在本地机器(Dbeaver)上打开一个数据库管理工具,并成功查询Hive表。

但是,我正在努力使用 Databricks 和 PySpark 查询 Hive 表。似乎要为 HiveContext 设置连接字符串,我通常会将其写入 hive-site.xml 文件中。但是 Databricks 没有给我这个选项。

我正在使用 Hive 2.1.1 和 Databricks 6.4(包括 Apache Spark 2.4.5、Scala 2.11)

现在我不知道如何简单地连接到我的 Hive 数据库。

# Spark context sc is implicit in Databricks
hive_context = spark.HiveContext(sc)

# I want to be able to do something like
df = hive_context.sql("SELECT...")

【问题讨论】:

docs.databricks.com/data/metastores/… @thebluephantom 我已经按照本教程进行操作,A) 它没有提供有关所涉及的 pyspark 语法的任何信息,B) 由于驱动程序兼容性,我遇到了错误;本教程假定 hive 数据库存储在 Azure 中,并为该用例指定驱动程序。我不知道如何确定合适的驱动程序。你知道如何解决这个问题吗? 系统管理员会这样做。我实际上正在安装一个新系统,但没有配置单元。在 spark 2 中它只是一个会话参数,应该全部设置... 酷......嗯,我不完全理解你对系统管理员的意思。但也许我会问......在玩了之后我发现 Databricks UI 让我为 HiveContext 指定会话参数。有问题的参数是 spark.hadoop.javax.jdo.option.ConnectionDriverName... 这是上面的教程指定 SQl 驱动程序的地方。鉴于我知道我的 ConnectionURL 是否有可能弄清楚 ConnectionDriverName 应该是什么? 我可能误解了。 【参考方案1】:

这是最反高潮的答案,但一直以来这是我组织内部的防火墙问题,而不是 jar 文件。我的组织根据需要允许和阻止对不同来源的访问。虽然很尴尬,但请相信我,这不是很明显的错误!

Databricks 预加载了许多此类 jar 文件。所以这段代码已经足够建立一个连接了。

import java.sql.DriverManager
val connection = DriverManager.getConnection("jdbc:hive2://hostname:10000/dbname", "usrname", "psswrd")
connection.isClosed()

这是我在谷歌上搜索错误并跟踪各种论坛(包括 SO)的线索但无济于事的一个例子。我与 Databricks SME 交谈以结束此网络问题。

【讨论】:

那么,你在笔记本上能做 spark.table(...) 吗?你能加入这两个吗?我怀疑是这样,但从未尝试过。还是您作为 jdbc 源阅读?【参考方案2】:

通过在 sparksession 构建器调用期间为 hive.metastore.uris 指定配置,如果您从任何其他发行版运行,将解决您的问题,但对于数据块,您必须为您的集群编辑 spark config

你可以参考下面的答案-

How to connect Spark SQL to remote Hive metastore (via thrift protocol) with no hive-site.xml?

How to add Spark configuration in Databricks cluster

【讨论】:

以上是关于如何使用 Databricks 查询外部 Hive 表的主要内容,如果未能解决你的问题,请参考以下文章

从 Hive 查询时,分区表中的数据不显示

如何将此查询转换为 Hive SQL?

如何在子查询中使用外部查询中的列从另一个表中获取结果?

从 PySpark 查询 Hive 表时出错

Databricks + ADF + ADLS2 + Hive = Azure Synapse

Databricks 上的 Spark - 缓存 Hive 表