2016-10-02 82 views
0

我能夠使用sqoop使用類似下面的命令導入MySQL表「標題」到HDFS:sqoop導入到hdfs和配置單元有什麼區別?

sqoop import --connect jdbc:mysql://localhost/employees --username=root -P --table=titles --target-dir=titles --m=1 

現在我要導入到蜂巢,如果我用下面的命令:

sqoop import --connect jdbc:mysql://localhost/employees --username=root -P --table titles --hive-import 

我將提示:

輸出目錄HDFS://本地主機:9000 /用戶/根/標題已經存在

在蜂巢,如果我做一個節目表,我得到如下:

hive> show tables; 
OK 
dept_emp 
emp 
myfirsthivetable 
parted1emp 
partitionedemp 

你可以看到有在蜂巢

沒有表名爲標題,我在這迷茫,對進口的sqoop數據,hdfs和配置單元之間是否存在1:1的關係?提示的含義是什麼?

謝謝你的啓發。

回答

2

正如Amit指出的那樣,由於您已經在第一個命令中創建了HDFS目錄,Sqoop拒絕覆蓋文件夾titles,因爲它已經包含數據。

在你的第二個命令,你告訴Sqoop導入(再次)整個表(這是已經在第一個命令導入)到蜂巢。由於您沒有將HDFS目標指定爲--target-dir,因此Sqoop將嘗試創建下的文件夾titles。如果該文件夾已經存在,則會引發錯誤。

當您告訴Hive顯示錶時,titles未出現,因爲第二個命令(hive-import)未成功,並且Hive不知道有關數據的任何信息。當您添加標誌--hive-import時,Sqoop在底層做了什麼來更新Hive Metastore,它是一個具有Hive表,分區和HDFS位置元數據的數據庫。

你可以只用一個Sqoop命令,而不是使用兩個不同的人做數據導入。如果刪除titles HDFS文件夾,並執行這樣的事情:

sqoop import --connect jdbc:mysql://localhost/employees --username=root 
-P --table=titles --target-dir /user/root/titles --hive-import --m=1 

這樣,你是拉從MySQL中的數據,創建/user/root/titles HDFS目錄和更新metastore,使蜂巢知道哪裏表(和數據)是。

但是,如果您不想刪除已導入數據的文件夾,該怎麼辦?在這種情況下,你可以create一個新的蜂巢表titles和使用這樣的指定數據的位置:

CREATE [TEMPORARY] [EXTERNAL] TABLE title  
    [(col_name data_type [COMMENT col_comment], ...)] 
    (...) 
    LOCATION '/user/root/titles' 

這樣一來,你就不需要再重新導入整個數據,因爲它是已經在HDFS中。

+0

謝謝Jaime您的詳細解釋。大家的幫助在這裏非常感謝。 – PasLeChoix

+0

只需再次嘗試通過指示target-dir = titles_new並將數據加載到配置單元中,當列出配置單元時,我可以看到新添加的表;但是,如果我以不同的方式列出它:'[root @ xie1 Desktop]#hdfs dfs -ls hdfs:// localhost:9000/user/root',它不在那裏。我也試過:'hdfs dfs -ls hdfs:// localhost:9000/user/titles_new',並提示沒有這樣的文件或目錄。 – PasLeChoix

+0

對不起,我想我犯了一個錯字。 '--target-dir'參數應該具有目錄的整個路徑。在這種情況下,'--target-dir =/user/root/titles'。你可以檢查導入的表是否在'/ titles'中? –

0

當您創建的蜂巢它最終創建HDFS上的目錄,因爲你已經跑了Hadoop的進口第一,因此名爲「標題」已對HDFS創建的目錄表。

您可以從HDFS中刪除/user/root/titles目錄,並再次運行配置單元導入命令或在導入時使用--hive-table選項。

您可以參考sqoop documentation

希望這會有所幫助。

+0

謝謝。 'hdfs dfs -ls hdfs:// localhost:9000/user/root'和'hdfs dfs -ls'給出了完全相同的結果? – PasLeChoix

+0

轉到您的hadoop安裝目錄並運行bin/hadoop fs -ls/user/root或bin/hadoop fs -lsr/user/root –

相關問題