如何访问 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访问与HBase关联的Hive表

将 Spark Dataframe 写入 HDP2.6 中的 Hive 可访问表

HiveContext - 无法访问在 hive 中映射为外部表的 hbase 表

如何使用 terraform 在 OCI 中的现有默认路由表中添加新规则

如何在不包含新列名和类型的情况下更改现有 Hive 表中的列注释?

Hive:无法为 HDFS 中的现有数据创建外部表