hive数据导入到Hbase中有两种方式。
方式一 —— 内部表映射
适用于数据量不是特别大的场景。
首先说一下Hbase数据到hive内部表的映射,代码如下:
create table stu_info{
key string comment '主键',
name string comment '名字',
age int comment'年龄'
}
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" =":key,info:name,info:name")
TBLPROPERTIES("hbase.table.name" = "stu");
这里解释一下每行代码的含义:
- 首先是创建hive的内部表,这个就不用多说了。
- stored by指定数据的存储方式
- SERDEPROPERTIES:表示字段映射,对应hive中的表字段的顺序,需要注意的是 :key指的是Hbase中的rowdy,hive表中要有一个key字段与之对应,否则会报错的。
- TBLPROPERTIES:表示表名映射,指定需要映射的Hbase表名。
具体的映射规则
- hbase中的空cell在hive中会补null
- hive和hbase中不匹配的字段会补null
- Bytes类型的数据,建hive表示加#b
- hive内部表的数据,由hive自己管理,因此删除hive表,则对应的Hbase表也会被删除。
方式二 —— 生成hfile,通过bulkload导入到hbase
适用于数据量较大的场景。
具体的操作步骤如下:
- 启动hive,添加需要的jar包
add jar /lib/hive-hbase-handler-2.3.3.jar;
add jar /lib/hbase-protocol-1.1.1.jar;
add jar /lib/hbase-common-1.1.1.jar;
add jar /lib/hbase-client-1.1.1.jar;
add jar /lib/hbase-server-1.1.1.jar;
- 创建hive表
create table stu_info{
name string comment '名字',
age int comment'年龄'
}
STORED AS
INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.hbase.HiveHFileOutputFormat'
TBLPROPERTIES ('hfile.family.path' = '/user/hive-hbase/info');
此处建表时需要注意,输出格式一定要为:HiveHFileOutputFormat。
/user/hive-hbase/info是生成的hfile在HDFS上的路径,其中info为Hbase的family。
可以向hive表中插入数据,然后查看HDFS的该目录下是否有文件
hdfs dfs -ls /user/hive-hbase/info
- 通过bulkload导入到hbase
创建对应的hbase表,其中info为family,应和上一步对应
执行bulkhead,将数据导入到hbase中
可以连接Hbase,查看数据有没有同步过来。