我是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文件的行末。
請幫我理解爲什麼這不起作用或者更好的方法是什麼。謝謝!
我沒有被鎖定到任何具體的方法,所以所有的選項將不勝感激。
感謝您的迴應,但由於我仍然在學習這一點,我不明白從我的DataFrame或RDD到HDFS API類。對此有何想法? –