将hbase数据备份至hive

背景

由于同事误操作, 将原先由hive中导至hbase中的原数据的表全被删除了, 现需要使用hive中的数据. 我将采取以下方式进行.
注意: 由hive导至hbase中的数据是通过程序导的, 它们的主键并不一致, 所以在紧急需要使用的情况下, 共11张表, 我选择了先建立hbase的外部表, 然后再建立hive内部表, 再将数据清洗至Hive的内部表中.

建hive外部表方式

构建hbase对应的Hive外部表

虽然hive的表都被删除了, 但原先的表结构还是备份的.

CREATE TABLE bigdata_graph_cmb_dev.tv_address (
object_key string COMMENT '主键',
standardized_addr string COMMENT '标准化地址(即7级整合成一条)',
address string COMMENT '标准化前的地址',
standardized_1 string COMMENT '标准化-省',
standardized_2 string COMMENT '标准化-市',
standardized_3 string COMMENT '标准化-区',
standardized_4 string COMMENT '标准化-乡',
standardized_5 string COMMENT '标准化-村',
standardized_6 string COMMENT '标准化-道路',
standardized_7 string COMMENT '标准化-门牌号',
update_date string COMMENT '更新时间'
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS textfile;

根据上面表结构创建外部表

create external table tv_address_external(
object_key string COMMENT '主键',
standardized_addr string COMMENT '标准化地址(即7级整合成一条)',
address string COMMENT '标准化前的地址',
standardized_1 string COMMENT '标准化-省',
standardized_2 string COMMENT '标准化-市',
standardized_3 string COMMENT '标准化-区',
standardized_4 string COMMENT '标准化-乡',
standardized_5 string COMMENT '标准化-村',
standardized_6 string COMMENT '标准化-道路',
standardized_7 string COMMENT '标准化-门牌号',
update_date string COMMENT '更新时间'
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping"=":key,objects:standardized_addr,objects:address,objects:standardized_1,objects:standardized_2,objects:standardized_3,objects:standardized_4,objects:standardized_5,objects:standardized_6,objects:standardized_7,objects:update_date")
TBLPROPERTIES("hbase.table.name"="bigdata_graph_cmb_dev:tv_address");

需要注意上语句中, "hbase.columns.mapping"=":key,......."中的hbase.columns.mapping"=":key,固定格式不变, key表示hbase的主键, 且语句中不能有空格, 否则会报错.
"hbase.table.name"="bigdata_graph_cmb_dev:tv_address"中的bigdata_graph_cmb_dev为hbase的空间名,如果没有,则不需要填.并且语句中也不能有空格, 否则也会报错。

将外部表的数据清洗至内部表

因为外部表关联hbase表后, 主键的row_key的格式是${hash分区}#${object_key}所以需要split一下。

insert overwrite table tv_address 
select 
    split(object_key, '#')[1], 
    standardized_addr,
    address,
    standardized_1,
    standardized_2,
    standardized_3,
    standardized_4,
    standardized_5,
    standardized_6,
    standardized_7,
    update_date
from tv_address_external;

其它方式(待补充)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值