使用Hive查询HBase数据

本文总阅读量

一、配置

1、整合工具类

(1)、版本问题

  • 我使用的是Hive-0.14.0和hbase-0.98.8

hive-Hbase-handler-0.14.0.jar

这个版本是跟着hive的

(2)、根据hive版本确定hbase版本

①、在maven仓库找到对应的依赖添加到pom.xml,例如:

1
2
3
4
5
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-hbase-handler</artifactId>
<version>0.14.0</version>
</dependency>
  • 在下载好的jar包/META-INF/maven/DEPENDENCIES中,找到hbase的版本

例如:hive-Hbase-handler-0.14.0.jar指明hbase的版本是0.98.3

  • 我用的是0.98.8,小的版本差异不影响

(2)、jar包导入

把下载到的hive-hbase-handler-0.14.0.jar放到hive的lib目录下。

2、设置环境变量

修改$HIVE_HOME/conf/hive-env.sh文件中的最后一行,内容如下:

1
export HIVE_AUX_JARS_PATH=/usr/local/hive-0.14.0/lib/hive-hbase-handler-0.14.0.jar:/usr/local/hbase-0.98.8-hadoop2/lib/hbase-client-0.98.8-hadoop2.jar:/usr/local/hbase-0.98.8-hadoop2/lib/zookeeper-3.4.6.jar

上述路径,根据自身情况配置

二、使用hive创建hbase表

1、开启hbase、hive

2、命令

1
2
3
4
5
6
CREATE TABLE hivetohbase1(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" = ":key,f1:c1",
"hbase.table.name" = "t1"
);

上述:属性”hbase.columns.mapping”的值中间不能有任何空格。

二、使用hive向hbase表插入数据

只支持insert插入,不支持load data插入。

1、命令

1
insert into table hivetohbase(表名) select * from (其他表);

1
insert into table hivetohbase(表名) values(...);

三、使用hive关联已存在的hbase表

1、hbase表的数据

1
2
3
4
5
6
7
hbase(main):008:0> scan 'test1'
ROW COLUMN+CELL
one column=address:home,timestamp=1460276233535,value=taiyang
one column=address:school,timestamp=1460370748876,value=shiyan
two column=address:home,timestamp=1460371067966,value=beijing
two column=address:school,timestamp=1460371058151,value=sanyuan
2 row(s) in 0.2790 seconds

2、第一次建表

1
2
3
4
5
6
hive> create external table hbasetest1(id int, home string, school string) row format delimited fields terminated by ','
> stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
> with serdeproperties(
> "hbase.columns.mapping" = ":key,address:name,address:school",
> "hbase.table.name" = "test1"
> );

查询:

1
2
3
4
hive> select * from hbasetest1;
OK
NULL NULL shiyan
NULL NULL sanyuan

  • 问题:id和name没有显示。
  • 发现:上面的建表语句”hbase.columns.mapping”属性的值写错了,把home写成了name.

3、第二次建表

1
2
3
4
5
6
hive> create external table hbasetest1two(id int, home string, school string) row format delimited fields terminated by ','
> stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
> with serdeproperties(
> "hbase.columns.mapping" = ":key,address:home,address:school",
> "hbase.table.name" = "test1"
> );

查询:

1
2
3
4
5
hive> select * from hbasetest1two;
OK
NULL taiyang shiyan
NULL beijing sanyuan
Time taken: 0.136 seconds, Fetched: 2 row(s)
  • 问题:id没有显示。
  • 发现:上面的建表语句,hive表中的id是int型,而hbase表中rowkey是string类型,不匹配所以报错。

3、第三次建表

1
2
3
4
5
6
hive> create external table hbasetest1three(id string, home string, school string) row format delimited fields terminated by ','
> stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
> with serdeproperties(
> "hbase.columns.mapping" = ":key,address:home,address:school",
> "hbase.table.name" = "test1"
> );

查询:

1
2
3
4
5
hive> select * from hbasetest1three;
OK
one taiyang shiyan
two beijing sanyuan
Time taken: 0.158 seconds, Fetched: 2 row(s)

成功~

四、注意

  • 使用hive创建hbase表,表中的数据时在hbase中存储的,hive中没有

证实:HDFS中/user/hive/warehouse/该表 中没有任何数据

  • 使用hive关联已存在的hbase表,用的是外部表,数据更不在hive中