如何访问Hive中的现有表?

时间:2017-10-21 11:14:09

标签: scala apache-spark hive apache-spark-sql

我正在尝试使用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。所有都在" user / hive / warehouse"地点。仅仅是为了测试我也尝试使用来自spark的create table,只是为了查找表位置。

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的Metastore),我也没有找到那些由spark创建的表。

火花位置是否与蜂巢控制台不同?

如果我需要从spark访问配置单元中的现有表,我该怎么办?

1 个答案:

答案 0 :(得分:2)

来自spark sql programming guide

: (我强调了相关部分)

  

通过放置您的hive-site.xml 来完成配置Hive,   core-site.xml(用于安全性配置)和hdfs-site.xml(用于   conf /.

中的HDFS配置文件      

使用Hive时,必须使用Hive实例化SparkSession   支持,包括连接到持久性Hive Metastore,   支持Hive serdes和Hive用户定义的函数。做的用户   没有现有的Hive部署仍然可以启用Hive支持。   当未由hive-site.xml配置时,自动上下文   在当前目录中创建metastore_db 并创建一个目录   由spark.sql.warehouse.dir配置,默认为该目录   Spark应用程序所在的当前目录中的spark-warehouse   开始

您需要向hive-site.xml目录添加resource配置文件。 这是使用hive工作的spark所需的最小值(将主机设置为配置单元的主机):

<?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>