Sqoop數據導入到HBase

Hbase具有冪等性,對於多次導入都可以一樣數據。不會新增數據。

1、oracle全量導入Hbase

sqoop import  \
 --connect jdbc:oracle:thin:@192.168.1.160:1521:test \
 --username test \
 --password-file /user/admin/sqoop/pwd/dev/test.pwd \
 --table TEST.TEST_BASE \
 --columns USER_ID,NAME,GROUP_NAME,LEVEL,CODE,REGISTER_TIME,CREATE_TIME,UPDATE_TIME \
 --hbase-create-table --hbase-table TEST_BASE \
 --hbase-row-key USER_ID   \
 --column-family personinfo \
-m 1

註釋:–hbase-create-table sqoop幫忙創建表。多次導入無影響。
–hbase-row-key 最好使用主鍵,多次導入具有冪等性。
-m 1 代表順序導入
–column-family 列族

2、oracle多對一導入Hbase

主要依靠quary進行關聯表導入一個Hbase表中。同時具有冪等性,oracle的表必須使用大寫。

sqoop import  \
-Dorg.apache.sqoop.splitter.allow_text_splitter=true \
 --connect jdbc:oracle:thin:@192.168.1.160:1521:test \
 --username test \
 --password-file /user/admin/sqoop/pwd/dev/test.pwd \
 --query 'select t.USER_ID, t.NAME, e.MOBILE, t.GROUP_NAME, t.LEVEL, t.CODE, t.REGISTER_TIME,  t.CREATE_TIME, t.UPDATE_TIME, e.CARD_TYPE,e.CARD_NO,e.SEX,e.BIRTH,e.CRT_TM,e.UPD_TM  from TEST.TEST_BASE t join TEST.TEST_PERINFO e on (t.USER_ID= e.ID) WHERE $CONDITIONS' \
 --split-by user_id \
 --hbase-create-table --hbase-table test_user_perinfo \
 --hbase-row-key USER_ID   \
 --column-family personinfo

註釋:
-Dorg.apache.sqoop.splitter.allow_text_splitter=true 主要是搭配 -m一起使用,默認-m 4用於對字符串的row-key進行分割
–quary conditions linux系統的變量,在執行過程中被賦值爲(1=0)想通過並行的方式導入結果query必須包含$CONDITIONS。和–split-by一起配合使用。
–password-file 密碼保存在文件中。當提交job時,必須使用文件形式的密碼。

3、mysql導入hbase

錯誤寫法:

sqoop import --connect jdbc:mysql://192.168.1.79:3306/test \
 --username 'user' --password '123456' \
 --query 'SELECT a.NAME,a.type,a.id,a.create_time FROM test.t_test_info a WHERE $CONDITIONS' \
 --split-by id \
 --hbase-table 'test_info' \
 --hbase-row-key 'type,name' \
 --column-family 'personinfo'

報錯:
FAILED Error: java.io.IOException: Could not insert row with null value for row-key column: name
這個問題我找了半天,使用SQL查詢了數據也沒有發現name爲null 。後面才發現,SELECT a.NAME,a.type,a.id,a.create_time FROM test.t_test_info a WHERE $CONDITIONS--hbase-row-key 'type,name' 的name大小寫不一樣。統一大小寫後。完美解決。

正確寫法:

sqoop import --connect jdbc:mysql://192.168.1.79:3306/test \
 --username 'user' --password '123456' \
 --query 'SELECT a.name,a.type,a.id,a.create_time FROM test.t_test_info a WHERE $CONDITIONS' \
 --split-by id \
 --hbase-table 'test_info' \
 --hbase-row-key 'type,id,name' \
 --column-family 'personinfo'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章