2015-10-28 64 views
2

我是Hadoop的新手,我正在使用單個節點集羣(用於開發)從關係數據庫中提取一些數據。使用Spark SQL和JDBC編寫Hive表

具體來說,我使用Spark(版本1.4.1),Java API來爲查詢提取數據並寫入Hive。我遇到了各種問題(並閱讀了手冊並嘗試在線搜索),但我認爲我可能會誤解這個基本部分,因爲我遇到了問題。

首先,我想我可以將數據讀入Spark,可以選擇運行一些Spark方法來操作數據,然後通過HiveContext對象將其寫入Hive。但是,似乎沒有任何方法可以直接從Spark發佈到Hive。真的嗎?

所以我需要一箇中間步驟。在寫入Hive之前,我嘗試了一些不同的數據存儲方法,並決定編寫一個HDFS文本文件,因爲它似乎對我最有用。但是,編寫HDFS文件時,我在文件中得到方括號,如下所示:[A,B,C]

因此,當我使用「LOAD DATA INPATH ...」將數據加載到Hive中時HiveQL語句,我得到Hive表中的方括號!

我錯過了什麼?或者更準確,能有人幫我明白我需要做的步驟:

  • 運行SQL Server或Oracle數據庫上的SQL
  • 寫數據到可被訪問的蜂巢表儀錶板工具。

我的代碼,現在,看起來是這樣的:

DataFrame df= sqlContext.read().format("jdbc").options(getSqlContextOptions(driver, dburl, query)).load(); // This step seem to work fine. 
JavaRDD<Row> rdd = df.javaRDD(); 
rdd.saveAsTextFile(getHdfsUri() + pathToFile); // This works, but writes the rows in square brackets, like: [1, AAA]. 
hiveContext.sql("CREATE TABLE BLAH (MY_ID INT, MY_DESC STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE"); 
hiveContext.sql("LOAD DATA INPATH '" + getHdfsUri() + hdfsFile + "' OVERWRITE INTO TABLE `BLAH`"); // Get's written like: 

MY_INT MY_DESC 
------ ------- 
     AAA] 

的INT列不被寫入,因爲在所有的領先[使得它不再是一個數值,最後一列顯示「]」在HDFS文件的行末。

請幫我理解爲什麼這不起作用或者更好的方法是什麼。謝謝!

我沒有被鎖定到任何具體的方法,所以所有的選項將不勝感激。

回答

1

好吧,我想清楚我做錯了什麼。我需要在HiveContext上使用寫函數,並需要使用com.databricks.spark.csv在Hive中編寫序列文件。這並不需要將文件保存在HDFS中,這非常棒,並且可以成功寫入Hive。

DataFrame df = hiveContext.createDataFrame(rdd, struct); 
df.select(cols).write().format("com.databricks.spark.csv").mode(SaveMode.Append).saveAsTable("TABLENAME"); 

我確實需要創建一個對象StructType,雖然,通入createDataFrame方法的數據類型的適當的映射(事情是在當前頁的中間所示:Support for User Defined Types for java in Spark)。 cols變量是一個Column對象的數組,它實際上只是一個列名稱數組(即像Column [] cols = {new Column(「COL1」),新Column(「COL2」)};