使用场景:主要想实现抽取hbase数据到hive中,Sqoop不支持对hbase的直接抽取,但是我们可以通过Phoenix映射hbase表实现。
安装好phoenix后对于HBase中已经存在的数据表不会自动进行映射,所以想要再phoenix中操作HBase已有数据表就需要手动进行配置。查看phoenix的版本,如果版本是4.10之前的,映射关系是根据列来映射的,phoenix可以通过create table(...)来映射;如果版本是4.10以后的,则只能通过视图来创建,create view(...),才能查询到hbase中的数据。
ps:创建表映射,删除表时,会将hbase中的表一并删除,视图不会有影响。
1、创建hbase表
hbase(main):014:0> create 'TESTDATA','INFO'
0 row(s) in 1.2140 seconds
2、插入数据
put 'TESTDATA','row001','INFO:NAME','aaa'
put 'TESTDATA','row002','INFO:NAME','bbb'
put 'TESTDATA','row001','INFO:AGE','18'
put 'TESTDATA','row002','INFO:AGE','19'
hbase(main):020:0> scan 'TESTDATA'
ROW COLUMN+CELL
row001 column=INFO:AGE, timestamp=1539676268928, value=18
row001 column=INFO:NAME, timestamp=1539676226267, value=aaa
row002 column=INFO:AGE, timestamp=1539676275006, value=19
row002 column=INFO:NAME, timestamp=1539676236753, value=bbb
2 row(s) in 0.0140 seconds
ps:Hbase数据表的默认主键列明是ROW
3、创建Phoenix表
create view TESTDATA ("ROW" varchar primary key,info.name varchar,info.age varchar) as select * from TESTDATA;
4、验证是映射
select * from testdata;
+---------+-------+------+
| ROW | NAME | AGE |
+---------+-------+------+
| row001 | aaa | 18 |
| row002 | bbb | 19 |
+---------+-------+------+
ps:此时我们已经建立了Phoenix映射hbase的关联表,需要注意的是Hbase是区分大小写的,在这里我们统一使用的是大写,因为在Sqoop抽取数据时,会把SQL语句自动转大写,回报表或列明未定义的错误,如果单纯的只是映射,对于小写的表明和列明用双引号括起来即可。
5、Sqoop抽取数据
sqoop import -D mapreduce.map.memory.mb=3072 --driver org.apache.phoenix.jdbc.PhoenixDriver --connect jdbc:phoenix:10.222.16.174:2181 --query "select * from testdata WHERE name='aaa' and \$CONDITIONS" --hive-import --hive-table testdata02 --target-dir /testSqoop --delete-target-dir --split-by name --hive-overwrite --null-string '\\N' --null-non-string '\\N'
6、查看hive中表
hive> show tables;
OK
test1
testdata
testdata01
testdata02
testdata11
tmp2
Time taken: 0.013 seconds, Fetched: 6 row(s)
hive> select * from testdata02;
OK
row001 aaa 18
Time taken: 0.04 seconds, Fetched: 1 row(s)
我们看到表抽取成功了!