如何使用 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 表的主要内容,如果未能解决你的问题,请参考以下文章