2017-10-21 47 views
2

我想用scala来访问spark应用程序中的HIVE。如何访问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-------------------") 

但它与错误讯息

表或视图中没有发现

,但是当我在蜂巢控制台运行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-------------------") 

此代码也正确执行(与成功注意事项),但奇怪的是,我可以从蜂房控制台找到此表。

即使我在mysql中使用select * from TBLS;(在我的设置中,我将mysql配置为配置单元的Metastore),但我没有找到从spark创建的那些表。

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

如果我需要从火花中访问蜂巢中的现有表,我该怎么办?

+0

你可以做'spark.sql(“SELECT * FROM 。测试”)节目( )' – mrsrinivas

+0

同样的结果和更多我可以从火花创建表,可以做“插入”,但蜂巢控制台不显示任何表名称。很大的困惑是这些桌子在哪里得到保存? – Biswajit

回答

2

spark sql programming guide: (我强调的相关部分)

蜂巢的结构是通过放置您的蜂房的site.xml完成, 核心的site.xml(安全性配置),和conf /中的hdfs-site.xml(用于HDFS配置的 )文件。

当与配置单元工作时,一个必须实例SparkSession与蜂巢 支持,包括连接到持久性蜂房metastore,用于蜂房SERDES 支持,以及配置单元的用户定义的函数。 没有现有Hive部署的用户仍然可以启用Hive支持。 当不是由蜂巢-site.xml中配置,上下文自动 在当前目录中创建和metastore_db创建一个目录 通过spark.sql.warehouse.dir配置,缺省值为在目录 火花仓库当前目录中的星火应用 开始

你需要一个hive-site.xml配置文件添加到resource目录。 这里是最低需要的值,火花与蜂巢工作(主机设置为蜂巢的主机):

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

非常感谢,您节省了我的一天,情况就是这样,我可以运行并连接现有的配置hive-site.xml后在火花配置中配置的配置单元。但是当我从IDE运行代码时,我的intellij(未提交),如何在代码中添加hive-site.xml,有什么想法? – Biswajit

+0

你有2个选项。你可以将文件添加到资源目录(与配置文件相同的位置),或者将该值设置为系统属性(在初始化spark会话之前),即'System.setProperty(“hive.metastore.uris”,“thrift: // host:9083“)' – lev

+0

@Biswajit,如果您觉得这个答案有用,请考虑将其标记为回答以帮助未来的读者更好地导航网站 – lev