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'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章