2016-03-28 81 views
0

我想通過mysql數據庫中的sqoop將數據加載到配置單元中已有的表中。我參考了以下指南以供參考: - http://sqoop.apache.org/docs/1.4.5/SqoopUserGuide.html#_importing_data_into_hive如何使用sqoop覆蓋配置單元中的數據

--hive-import已成功嘗試並通過測試。

我創建了一個蜂巢表如下: -

  1. create table sqoophive (id int, name string, location string) row format delimited fields terminated by '\t' lines terminated by '\n' stored as textfile;

  2. 加載的數據根據​​需要。

  3. 我想用--hive-overwrite選項覆蓋上表中的內容。根據上述指導 - 「--hive-overwrite覆蓋Hive表中的現有數據。」

「如果Hive表已經存在,則可以指定--hive-overwrite選項來指示必須替換配置單元中的現有表。」

所以,我想下面的查詢分別得出結果: -

sqoop import --connect jdbc:mysql://localhost/test --username root --password 'hr' --table sample --hive-import --hive-overwrite --hive-table sqoophive -m 1 --fields-terminated-by '\t' --lines-terminated-by '\n'

sqoop import --connect jdbc:mysql://localhost/test --username root --password 'hr' --table sample --hive-overwrite --hive-table sqoophive -m 1 --fields-terminated-by '\t' --lines-terminated-by '\n'

而不是在現有的表更換內容,它只是在下面的路徑中創建的文件/user/<username>/<mysqltablename>

請問有人能解釋我哪裏出錯了嗎?

回答

0

第一個查詢應該可以正常工作。由於架構已經存在,我沒有給出字段終止和行終止。

關鍵字--hive-import--hive-overwrite應該在那裏。

如果只有--hive-overwrite存在,它不會將數據加載到表中。只是複製到hdfs。

0

它把_SUCCESS文件中

/user/<username>/<mysqltablename> 

您可以更改與--warehouse-DIR 前雲:--warehouse-DIR/tmp目錄

人會認爲蜂巢覆寫會處理這個問題,意思是先刪除那個目錄。但出於充分理由,Hive不希望開始移除HDFS中的dirs。如果還有其他東西放在那裏呢?

配置單元覆蓋寫道:「我要覆蓋Hive中的行,而不是添加到表中。」因此你不會有重複。

您必須先刪除該目錄和_SUCCESS文件;或者更好,在導入成功之後。

hadoop fs -rm -R /user/<username>/<mysqltablename> 
0

sqoop import用了--target-dir OR --warehouse-dir(用於--hive-import)將導入/user/<username>/<mysqltablename>

By default,Sqoop將導入一個名爲foo到指定的目錄 foo在HDFS你的home目錄內表。例如,如果您的用戶名 爲someuser,則導入工具將寫入 /user/someuser/foo/(files)。您可以使用--warehouse-dir參數調整 導入的父目錄。

您也可以明確地選擇目標目錄中--target-dir PARAM

@hrobertv說,--hive-overwrite不會刪除現有目錄,但它會覆蓋蜂巢表的HDFS數據位置。如果要將新數據保存在與原點相同的位置上,則必須先刪除現有表dir,然後運行sqoop導入,並指定--target-dir--warehouse-dir--hive-overwrite,以按照您的要求將數據存儲在特定位置...