當前位置:成語大全網 - 新華字典 - 如何從Oracle到hive

如何從Oracle到hive

使用Sqoop從Oracle導入數據到Hive的方法

導入數據

設置HADOOP_HOME

$ HADOOP_HOME=/path/to/some/hadoop sqoop import --arguments...

下載合適的Sqoop並解壓到硬盤,所謂合適即Sqoop的版本應該和Hadoop的版本相匹配。筆者的Hadoop版本是1.03,下載的Sqoop是版本1.4.2。

$ tar zvxf sqoop-1.4.2.bin__hadoop-1.0.0.tar.gz

下載合適的JDBC驅動,將下載的JDBC的驅動放到Sqoop的lib文件夾下。

導入數據

$ sqoop import --hive-import --connect jdbc:oracle:thin:@192.168.56.111:1521:DBNAME --username USERNAME --password PASSWORD --verbose -m 1 --table TABLENAME

DBNAME:數據庫名

USERNAME:用戶名

PASSWORD:密碼

TABLENAME:表名

-m:導入數據的進程的並發數,默認是4。如果導入的數據不大的話,不妨設置成1,這樣導入更快。壹般來說Sqoop會使用主鍵來平均地分割數據。並發導入的時候可以設置相關的分割列等等,具體的做法參考官方的文檔。

如果Oracle是安裝在遠程的電腦上,要確保Sqoop可以ping通Oracle所在的電腦。例如如果Oracle安裝在Win7上面,可能需要關閉Win7的防火墻。另外,需要將Oracle配置成可以遠程訪問的。

註意,用戶名和表名應該要是大寫的,除非它們在創建的時候是名字是放在引號中的大小寫混合的形式。

壹個很奇怪的錯誤

筆者在導入數據的過程中,發現壹個問題,就是導入時沒有提示任何錯誤,在HDFS中也看到生成了相關的文件,但是在Hive中使用命令show TABLES時卻沒有看到新導入的表格。此時有兩種解決方案。壹種是在Hive中手動地使用CREAT命令創建出表格,然後再SELECT壹個,會發現表裏有數據了。因此筆者猜測(只是猜測)可能是因為導入之後表格的元數據沒有寫入到Hive中。筆者查找了相關的資料,發現Hive默認是將元數據存儲在derby中,所以筆者考慮將derby換成MySQL。

方法:/s/blog_3fe961ae0101925l.html

將元數據存儲在MySQL後,再導入就發現沒有問題了。

增量導入

另外壹個問題,如果我們要導入某個表中的新加入的部分,可以使用--check-column、--incremental、--last-value三個參數,--check-column指定要檢查的列,--incremental指定某種增加的模式,只有兩個合法的值,append 和lastmodified。如果--incremental為append,則Sqoop會導入--check-column指定的列的值大於--last-value所指定的值的記錄。如果--incremental為lastmodified,則Sqoop會導入--check-column指定的列的值(這是壹個時間戳)近於--last-value所指定的時間戳的記錄。例如下面的命令可以導入列ID的值大於4的所有記錄。

$ sqoop import --hive-import --connect jdbc:oracle:thin:@192.168.56.111:1521:DBNAME --username USERNAME --password PASSWORD --verbose -m 1 --table TABLENAME --check-column ID --incremental append --last-value 4