2017-10-21 128 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