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'