如何访问 Hive 中的现有表?
Posted
技术标签:
【中文标题】如何访问 Hive 中的现有表?【英文标题】:How to access existing table in Hive? 【发布时间】:2018-04-02 10:12:49 【问题描述】:我正在尝试使用 scala 从 spark 应用程序访问 HIVE。
我的代码:
val hiveLocation = "hdfs://master:9000/user/hive/warehouse"
val conf = new SparkConf().setAppName("SOME APP NAME").setMaster("local[*]").set("spark.sql.warehouse.dir",hiveLocation)
val sc = new SparkContext(conf)
val spark = SparkSession
.builder()
.appName("SparkHiveExample")
.master("local[*]")
.config("spark.sql.warehouse.dir", hiveLocation)
.config("spark.driver.allowMultipleContexts", "true")
.enableHiveSupport()
.getOrCreate()
println("Start of SQL Session--------------------")
spark.sql("select * from test").show()
println("End of SQL session-------------------")
但它最终会出现错误消息
找不到表或视图
但是当我在 hive 控制台下运行 show tables;
时,我可以看到该表并且可以运行 Select * from test
。所有都在“用户/配置单元/仓库”位置。只是为了测试,我也尝试从 spark 中创建表,只是为了找出表的位置。
val spark = SparkSession
.builder()
.appName("SparkHiveExample")
.master("local[*]")
.config("spark.sql.warehouse.dir", hiveLocation)
.config("spark.driver.allowMultipleContexts", "true")
.enableHiveSupport()
.getOrCreate()
println("Start of SQL Session--------------------")
spark.sql("CREATE TABLE IF NOT EXISTS test11(name String)")
println("End of SQL session-------------------")
此代码也正确执行(带有成功说明),但奇怪的是我可以从 hive 控制台找到此表。
即使我在 mysql 中使用select * from TBLS;
(在我的设置中,我将 mysql 配置为 hive 的元存储),我也没有找到从 spark 创建的那些表。
spark 位置是否与 hive 控制台不同?
如果我需要从 spark 访问 hive 中的现有表,我该怎么办?
【问题讨论】:
【参考方案1】:来自spark sql programming guide: (我强调了相关部分)
Hive 的配置是通过放置你的 hive-site.xml 来完成的, core-site.xml(用于安全配置)和 hdfs-site.xml(用于 HDFS 配置)文件在 conf/.
使用 Hive 时,必须使用 Hive 实例化 SparkSession 支持,包括与持久 Hive 元存储的连接, 支持 Hive serdes 和 Hive 用户定义的函数。做的用户 没有现有的 Hive 部署仍然可以启用 Hive 支持。 hive-site.xml 未配置时,上下文自动 在当前目录下创建 metastore_db 并创建一个目录 spark.sql.warehouse.dir 配置,默认为目录 Spark 应用程序所在的当前目录中的 spark-warehouse 开始
您需要将hive-site.xml
配置文件添加到resource
目录。
这是 spark 与 hive 一起工作所需的最低值(将主机设置为 hive 的主机):
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://host:9083</value>
<description>IP address (or fully-qualified domain name) and port of the metastore host</description>
</property>
</configuration>
【讨论】:
非常感谢,您救了我的命,是这样吗,在 spark conf 中处理 hive-site.xml 后,我可以运行并连接我现有的 hive 设置。但是当我从 IDE 运行代码时,在我的情况下是 intellij,(不提交),我如何在我的代码中添加 hive-site.xml,知道吗? 您有 2 个选项。您可以将文件添加到资源目录(与配置文件相同的位置),或将该值设置为系统属性(在初始化 spark 会话之前),即System.setProperty("hive.metastore.uris", "thrift://host:9083")
以上是关于如何访问 Hive 中的现有表?的主要内容,如果未能解决你的问题,请参考以下文章
将 Spark Dataframe 写入 HDP2.6 中的 Hive 可访问表
HiveContext - 无法访问在 hive 中映射为外部表的 hbase 表
如何使用 terraform 在 OCI 中的现有默认路由表中添加新规则