[Hive]HBaseIntegration:通过Hive读写HBase,


业务背景

unmatch_oppon_pro是一张Hive表,现在需要将其导入到HBase中。

Hive中的unmatch_oppon_pro的表结构如下:

字段 类型
id bigint
site_id int
product_code string
product_name string
product_url string
update_time string
product_price double
appraisal_num int
sold_num int

导入到HBase时,将 product_code 作为HBase表的 row_key

业务分析

利用Hive和HBase整合,可以实现通过Hive,读写HBase表,详细可以参考HBaseIntegration

实现方式

全量覆盖导入

代码如下:

create table unmatch_oppon_pro_hbase 
(
    row_key         string,
    id              bigint,
    site_id         int,
    product_code    string,
    product_name    string,
    product_url     string,
    update_time     string,
    product_price   double,
    appraisal_num   int,
    sold_num        int
) STORED BY "org.apache.hadoop.hive.hbase.HBaseStorageHandler" WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:id,info:site_id,info:product_code,info:product_name,info:product_url,info:update_time,info:product_price,info:appraisal_num,info:sold_num") TBLPROPERTIES ("hbase.table.name"="unmatch_oppon_pro");

insert overwrite table unmatch_oppon_pro_hbase 
select 
    product_code as row_key,
    id,
    site_id,
    product_code,
    product_name,
    product_url,
    update_time,
    product_price,
    appraisal_num,
    sold_num 
from pms.unmatch_oppon_pro;

上面的代码是建立Hive内部表,为了让这张Hive内部表可以读写HBase表,需要如下操作:

  • create table时设置存储方式
STORED BY "org.apache.hadoop.hive.hbase.HBaseStorageHandler"
  • 设置Hive列名和HBase表的列对应
"hbase.columns.mapping" = ":key,info:id,info:site_id,info:product_code,info:product_name,info:product_url,info:update_time,info:product_price,info:appraisal_num,info:sold_num

其中":key"表示HBase的row_key,对应Hive表的第一个字段row_key string

"info:id,info:site_id,info:product_code,info:product_name,info:product_url,info:update_time,info:product_price,info:appraisal_num,info:sold_num"

表示HBase的列族和列,其中info是HBase表的列族,id、site_id、product_code等作为info的列

  • 可选:设置HBase的表名

"hbase.table.name"="unmatch_oppon_pro",这个如果不指定的话,最终生成的HBase表与Hive表同名

执行以后结果如下

hbase(main):001:0> describe 'unmatch_oppon_pro'
DESCRIPTION         ENABLED
'unmatch_oppon_pro', {NAME => 'info', DATA_BLOCK_ENCODING => 'NONE', 
BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS =>  true
'1', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', 
KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', 
IN_MEMORY=> 'false', BLOCKCACHE => 'true'}
1 row(s) in 2.4440 seconds

hbase(main):002:0> scan 'unmatch_oppon_pro',{LIMIT=>1} 
ROW         COLUMN+CELL
1000001232  column=info:appraisal_num, timestamp=1432528332998, value=4
1000001232  column=info:id, timestamp=1432528332998, value=112932511
1000001232  column=info:product_code, timestamp=1432528332998, value=1000001232
1000001232  column=info:product_name, timestamp=1432528332998, value=\xE4\xB8\x80\xE7
1000001232  column=info:product_price, timestamp=1432528332998, value=318.0
1000001232  column=info:product_url, timestamp=1432528332998, value=http://item.jd.com/1000001232.html
1000001232  column=info:site_id, timestamp=1432528332998, value=1001
1000001232  column=info:update_time, timestamp=1432528332998, value=2015-05-22 01:58:57.0
1 row(s) in 0.1530 seconds

增量覆盖导入

代码如下:

create external table unmatch_oppon_pro_hbase 
(
    row_key         string,
    id              bigint,
    site_id         int,
    product_code    string,
    product_name    string,
    product_url     string,
    update_time     string,
    product_price   double,
    appraisal_num   int,
    sold_num        int
) STORED BY "org.apache.hadoop.hive.hbase.HBaseStorageHandler" WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:id,info:site_id,info:product_code,info:product_name,info:product_url,info:update_time,info:product_price,info:appraisal_num,info:sold_num") TBLPROPERTIES ("hbase.table.name"="unmatch_oppon_pro");

insert overwrite table unmatch_oppon_pro_hbase 
select 
    product_code as row_key,
    id,
    site_id,
    product_code,
    product_name,
    product_url,
    update_time,
    product_price,
    appraisal_num,
    sold_num 
from pms.unmatch_oppon_pro;

实际上,增量更新与全量覆盖更新的区别,在于增量更新建立的是Hive的外表


全量覆盖和增量更新的区别

  • 区别如下

    • 增量更新,建立的是Hive外表;而全量覆盖建立的是Hive内部表;
    • 增量更新,必须先创建HBase表;而全量覆盖不需要事先建立HBase表;
    • 增量更新,是在原有的HBase表的基础上新增数据,不改变原有数据;而全量覆盖则会覆盖原有数据

相关内容