HBASE中incrementColumnValue方法联合hive相应的坑

本文详细记录了解决HBase计数器在实时数据计数过程中遇到的问题,特别是在与Hive外部表集成时出现的显示异常。通过调整数据类型和建表语句,成功解决了Hive表中数据显示为空字符串的问题。

    最近在项目开发中遇到了一个使用hbase计数器对实时数据进行计数发生的问题。花了老长时间,必须得记录下来,希望能帮到一些开发者。

    业务背景是需要计算各个车场的车流进出的数据。在这个场景下想到用HBASE的incrementColumnValue方法会很好的对车流的进出进行一个计数,最后达到一个实时计算出车流各项指标的效果。

   首先你以为hbase与hive的外部表集成很友好吗?并不是!!!

   接下来看一下问题

    之前直接在hive当中建一张hbase的外部表,建表语句如下

CREATE EXTERNAL TABLE if not exists ods_mixc.ta_cstmr_car_flow_for_15min_ext
(
  rowkey           string  comment 'hbase,rowkey',
  innum             string comment '进口数量',
  outnum           string comment '出口数量'

STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
WITH SERDEPROPERTIES (
'hbase.columns.mapping'=":key,
cf1:innum,
cf1:outnum"

TBLPROPERTIES("hbase.table.name" = "ods_mixc:mixc_cstmr_car_flow_for_15min_data");

紧接着调用了hbase计数器,把数据直接写到hbase里面,就是这个方法 -- table.incrementColumnValue,

使用到的人会发现,最后一个参数只允许传一个long类型。

接下来会在hbase看到自己插入的数据。

long类型的值被转换成这样第一次这样用hbase的人会不会觉得奇怪,其实这个是没有问题的。hbase由于暂时只支持String类型数据的存取,所以自增的long值会在hbase中转换成这样,显示出这个样子。

可以通过这个帖子进行详细了解

https://www.cnblogs.com/zhengrunjian/p/4535273.html

这个value虽然没有问题,但是我们总不可能肉眼去判断这个值我们是否计算正确。之前建的hive表就派上了用场。

再看下我们hbase对应的hive表。之前我们为什么要建这个外部表呢,就是为了能够直观的看到hbase的二进制表示,就如上图。

这就是之前困扰我很久的问题。

首先如上建的外部表,最后数据在hive当中显示是什么样的,可以看下图

可以看到,明明写了数据进入hbase,为什么hive中显示是空字符串呢(如果是null的话,会显示null)

找了半天,考虑是不是hive得外部表有问题。接下来换了一个建表语句

注意这里不需要删除之前建的hbase内部表!!!只需要删除hive外部表

CREATE EXTERNAL TABLE if not exists ods_mixc.ta_cstmr_car_flow_for_15min_ext
(
  rowkey           string  comment 'hbase,rowkey',
  innum             Integer comment '进口数量',  -- 数据类型做了修改
  outnum           Integer comment '出口数量'

STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
WITH SERDEPROPERTIES (
'hbase.columns.mapping'=":key,
cf1:innum#b,  --至于这里为什么要加#b,可以参考这个博客https://blog.youkuaiyun.com/piaole361/article/details/78597097
cf1:outnum#b"

TBLPROPERTIES("hbase.table.name" = "ods_mixc:mixc_cstmr_car_flow_for_15min_data");

此时查到hive表的数据是

之前我已经对innum做了+1操作,但是显示是0。觉得很奇怪,并且我武断的认为hive的显示没问题,于是方向被绕道解决

代码问题上,因此在incrementColumnValue方法上纠结,但是这里其实做的操作很少,就是调用hbase的api。

后面还是觉得代码应该没有问题,重新回到建表语句上来,这个是将建表语句改成这个

同样,hbase内部表不需要删除(提醒下刚接触hbase的人,像我这样~~~)

CREATE EXTERNAL TABLE if not exists ods_mixc.ta_cstmr_car_flow_for_15min_ext
(
  rowkey           string  comment 'hbase,rowkey',
  innum            bigint comment '进口数量',  --改成bigint
  outnum           bigint comment '出口数量'

STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
WITH SERDEPROPERTIES (
'hbase.columns.mapping'=":key,
cf1:innum#b,
cf1:outnum#b"

TBLPROPERTIES("hbase.table.name" = "ods_mixc:mixc_cstmr_car_flow_for_15min_data");
最后查到hive中数据显示:

问题解决。

考虑到hive中Integer跟bigint是可以互转的,但是与hbase混搭就出现问题。大家可以自行了解一下原因是什么,这里不做过多介绍,时间紧,难有时间码博客

这次也是实在遇到坑了,希望可以帮助到一些人,也请各位指点一二

需求实现主要用到的技术:storm+kafka+hbase(存储明细,计算指标,指标存储)+传统数据库(落地)

### 方法概述 将 HBase 中的数据导入到 Hive 可以通过多种方式实现,其中最常用的方法是使用 **HiveHBase 存储处理器(Storage Handler)**。这种方法允许 Hive 直接访问 HBase 表,并将其作为外部表进行查询和操作。 ### 使用 HiveHBase 存储处理器 #### 1. 配置 HiveHBase 环境 确保以下条件满足: - HiveHBase 已正确安装并运行。 - Hive 配置文件 `hive-site.xml` 中包含 HBase 的相关配置。 - Hive 的类路径中包含 HBase 的依赖库(如 `hbase-client`, `hbase-common`, `hive-hbase-handler` 等)。 #### 2. 创建 Hive 外部表并映射到 HBaseHive 提供了一个存储处理器 `org.apache.hadoop.hive.hbase.HBaseStorageHandler`,用于连接 HiveHBase。 ```sql CREATE EXTERNAL TABLE hive_hbase_table ( key STRING, col1 STRING, col2 STRING ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ( "hbase.columns.mapping" = ":key,cf:col1,cf:col2" ) TBLPROPERTIES ( "hbase.table.name" = "hbase_table_name" ); ``` - `hbase_table_name`:实际的 HBase 表名。 - `cf:col1` 和 `cf:col2`:HBase 列族和列名。 - `key` 对应 HBase 的行键(RowKey)[^1]。 #### 3. 查询 Hive 表 创建完成后,可以通过 Hive 查询 HBase 表中的数据: ```sql SELECT * FROM hive_hbase_table; ``` #### 4. 数据转换与持久化 如果需要将数据持久化到 Hive 的内部表中,可以创建一个 Hive 内部表并将数据插入其中: ```sql CREATE TABLE internal_hive_table ( key STRING, col1 STRING, col2 STRING ); INSERT INTO TABLE internal_hive_table SELECT * FROM hive_hbase_table; ``` ### 其他方法 #### 使用 Apache Sqoop 导出 HBase 数据 虽然 Sqoop 主要用于在 Hadoop 和关系型数据库之间传输数据,但在某些场景下也可以通过 MapReduce 将 HBase 数据导出为中间格式(如 Parquet 或 Text),然后再加载到 Hive 中。 示例命令: ```bash sqoop export \ --connect jdbc:mysql://localhost/mydb \ --username root \ --password password \ --table mytable \ --export-dir /user/hive/warehouse/hive_hbase_table ``` 需要注意的是,这种方式通常需要额外的步骤来处理 HBase 数据格式,并不是直接支持 HBaseHive 的迁移[^2]。 ### 注意事项 - HiveHBase 版本兼容性非常重要,必须确保使用的 Hive 版本支持当前 HBase 版本。 - 如果 HBase 表结构复杂或数据量较大,建议优化 Hive 查询性能,例如设置合适的分区策略或调整 MapReduce 参数。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值