Hive 映射 HBase 表方式
HBase 表映射到 Hive 中 Hive 内部表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 CREATE TABLE ods.s01_buyer_calllogs_info_ts ( key string comment "hbase rowkey", buyer_mobile string comment "手机号", contact_mobile string comment "对方手机号", call_date string comment "发生时间", call_type string comment "通话类型", init_type string comment "0-被叫,1-主叫", other_cell_phone string comment "对方手机号", place string comment "呼叫发生地", start_time string comment "发生时间", subtotal string comment "通话费用", use_time string comment "通话时间(秒)" ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,record:buyer_mobile,record:contact_mobile,record:call_date,record:call_type,record:init_type,record:other_cell_phone,record:place,record:start_time,record:subtotal,record:use_time") TBLPROPERTIES("hbase.table.name" = "s01_buyer_calllogs_info_ts");
Hive 每一个字段得映射到 HBase 的列簇的列。如果只想映射列簇,看第三种方式
建好表之后,进入 hbase shell 执行 list 能看到表 s01_buyer_calllogs_info_ts
Hive drop 掉此表时,HBase 也被 drop
创建内部表可以不指定 hbase.table.name
Hive 外部表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # HBase 建表 create 'buyer_calllogs_info_ts', 'record', {SPLITS_FILE => 'hbase_calllogs_splits.txt'} # Hive 建表 CREATE EXTERNAL TABLE ods.s10_buyer_calllogs_info_ts ( key string comment "hbase rowkey", buyer_mobile string comment "手机号", contact_mobile string comment "对方手机号", call_date string comment "发生时间", call_type string comment "通话类型", init_type string comment "0-被叫,1-主叫", other_cell_phone string comment "对方手机号", place string comment "呼叫发生地", start_time string comment "发生时间", subtotal string comment "通话费用", use_time string comment "通话时间(秒)" ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,record:buyer_mobile,record:contact_mobile,record:call_date,record:call_type,record:init_type,record:other_cell_phone,record:place,record:start_time,record:subtotal,record:use_time") TBLPROPERTIES("hbase.table.name" = "buyer_calllogs_info_ts");
从方式需要先在 HBase 建好表,然后在 Hive 中建表
Hive drop 掉表,HBase 表不会变
Hive 映射 HBase 的列簇 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # 内部表 CREATE TABLE hbase_table_1 ( value map<string,int>, row_key int ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ( "hbase.columns.mapping" = "cf:,:key"); # Hive insert 插入方式 INSERT OVERWRITE TABLE hbase_table_1 SELECT map(bar, foo), foo FROM pokes WHERE foo=98 OR foo=100; # 外部表 CREATE EXTERNAL TABLE hbase_table_2 ( value map<string,int>, row_key int ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ( "hbase.columns.mapping" = "cf:,:key") TBLPROPERTIES("hbase.table.name" = "hbase_table_22");
在 HBase 查看结果
可以根据需求确定,详细参见官方文档
一个简单的测试 在查阅资料时看到一个很有意思的测试。感兴趣的可以自己阅读 一个简单的测试:HBase-Hive 映射表
测试结论:
可以看到,同一张HBase表可以映射多张 Hive 外部表,并且查询列互不影响。
可见向不同 Hive 外部表中插入数据是不会影响HBase其他列的。
insert into 与 insert overwrite 操作HBase-Hive映射外部表结果是一样的,且均是基于Hive表所属列进行更新,不会影响其他列的值。
注意点 1、HBase 中的空 cell 在 Hive 中会补 null
2、Hive 和 HBase 中不匹配的字段会补 null
3、Bytes 类型的数据,建 Hive 表示加#b, 因为 HBase 中 double,int , bigint 类型以byte方式存储时,用字符串取出来必然是乱码。
4、其中:key代表的是 HBase 中的 rowkey, Hive 中也要有一个 key 与之对应, 不然会报错, cf 指的是 HBase 的列族, 创建完后,会自动把 HBase 表里的数据同步到 Hive 中
参考链接