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'