[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表的基础上新增数据,不改变原有数据;而全量覆盖则会覆盖原有数据
时间: 2024-10-07 19:43:29

[Hive]HBaseIntegration:通过Hive读写HBase的相关文章

hive中udf读写hbase

在大数据开发过程中经常会遇到,将hive中处理后的结果写入hbase中,每次都要写java程序会非常浪费时间,我们就想了一个办法 ,用hive的udf来实现. 只需要调用同一个udf,将表名字段名以及每一个字段的值作为udf的参数,就可以实现写hbase了. 这样大大的节省了开发时间,提升了开发效率. 大家可以按照这种思路写自己需要的功能.这里只简单的列举几个供大家参考,具体操作如下: 一.依赖的jar包 commons-codec-1.7.jar commons-collections-3.2

Hive 12、Hive优化

要点:优化时,把hive sql当做map reduce程序来读,会有意想不到的惊喜. 理解hadoop的核心能力,是hive优化的根本. 长期观察hadoop处理数据的过程,有几个显著的特征: 1.不怕数据多,就怕数据倾斜. 2.对jobs数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联多次汇总,产生十几个jobs,没半小时是跑不完的.map reduce作业初始化的时间是比较长的. 3.对sum,count来说,不存在数据倾斜问题. 4.对count(distinct )

[hive学习翻译]Hive - Introduction

术语"大数据"用于大数据集的集合,包括大量,高速度和各种日益增加的数据.使用传统的数据管理系统,很难处理大数据.因此,Apache Software Foundation引入了一个称为Hadoop的框架来解决大数据管理和处理难题. HadoopHadoop是一个开放源代码框架,用于在分布式环境中存储和处理大数据.它包含两个模块,一个是MapReduce,另一个是Hadoop分布式文件系统(HDFS). MapReduce:它是一个并行编程模型,用于在大型商品硬件集群上处理大量的结构化,

【Hive三】Hive理论

1. Hive基础 1. Hive基础 Hive基本概念 引入原因: Hive是什么 Hive数据管理 四种数据模型 Hive内部表和外部表 Hive数据类型 Hive的优化 Map的优化: Reduce 的优化 一个Reduce: 分区裁剪(partition) 笛卡尔积 Map join Union all Multi-insert & multi-group by Automatic merge Multi-Count Distinct Hive优化-- 大小表关联 Hive优化-- 大大

Hive基础之Hive体系架构&运行模式&Hive与关系型数据的区别

Hive架构 1)用户接口: CLI(hive shell):命令行工具:启动方式:hive 或者 hive --service cli ThriftServer:通过Thrift对外提供服务,默认端口是10000:启动方式:hive --service hiveserver WEBUI(浏览器访问hive):通过浏览器访问hive,默认端口是9999:启动方式:hive --service hwi 2)元数据存储(Metastore):启动方式:hive -service metastore

Hive基础之Hive是什么以及使用场景

Hive是什么1)Hive 是建立在Hadoop (HDFS/MR)上的用于管理和查询结果化/非结构化的数据仓库:2)一种可以存储.查询和分析存储在Hadoop 中的大规模数据的机制:3)Hive 定义了简单的类SQL 查询语言,称为HQL,它允许熟悉SQL 的用户查询数据:4)允许用Java开发自定义的函数UDF来处理内置无法完成的复杂的分析工作:5)Hive没有专门的数据格式(分隔符等可以自己灵活的设定): ETL的流程(Extraction-Transformate-Loading):将关

Hive基础之Hive环境搭建

Hive默认元数据信息存储在Derby里,Derby内置的关系型数据库.单Session的(只支持单客户端连接,两个客户端连接过去会报错): Hive支持将元数据存储在关系型数据库中,比如:Mysql/Oracle: 本案例采用的是将hive的元数据存储在MySQL中,故需要先安装MySQL数据库,使用的是CentOS6.4版本. MySQL安装 采用yum安装方式安装: yum install mysql #安装mysql客户端 yum install mysql-server #安装mysq

Hive 实战(1)--hive数据导入/导出基础

前沿: Hive也采用类SQL的语法, 但其作为数据仓库, 与面向OLTP的传统关系型数据库(Mysql/Oracle)有着天然的差别. 它用于离线的数据计算分析, 而不追求高并发/低延时的应用场景. 最显著的特别是, Hive的数据是Schema On Read, 对数据的写入非常的自由和松散, 而对数据的读取则作了各种限制. 而RMDBS则是Schema On Write, 对数据写入限制非常的严苛. *). 数据导入/导出 让我们体验以下Hive中数据如何导入: 1). 创建数据库 db_

Hive(四)hive函数与hive shell

一.hive函数 1.hive内置函数 (1)内容较多,见< Hive 官方文档>            https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF        (2)详细解释:            http://blog.sina.com.cn/s/blog_83bb57b70101lhmk.html (3) 测试内置函数的快捷方式: 1.创建一个 dual 表 create table dual