Hbase JavaAPI使用 2

简介: Hbase JavaAPI使用

6 需求三:查看一条数据

查询rowkey为4944191的所有列的数据,并打印出来。

实现步骤:

  1. 获取HTable
  2. 使用rowkey构建Get对象
  3. 执行get请求
  4. 获取所有单元格
  5. 打印rowkey
  6. 迭代单元格列表
  7. 关闭表
    参考代码:
@Test
public void getOneTest() throws IOException {
    // 1. 获取HTable
    TableName waterBillTableName = TableName.valueOf("WATER_BILL");
    Table waterBilltable = connection.getTable(waterBillTableName);
    // 2. 使用rowkey构建Get对象
    Get get = new Get(Bytes.toBytes("4944191"));
    // 3. 执行get请求
    Result result = waterBilltable.get(get);
    // 4. 获取所有单元格
    List<Cell> cellList = result.listCells();
    // 打印rowkey
    System.out.println("rowkey => " + Bytes.toString(result.getRow()));
    // 5. 迭代单元格列表
    for (Cell cell : cellList) {
        // 打印列蔟名
        System.out.print(Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()));
        System.out.println(" => " + Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
    }
    // 6. 关闭表
    waterBilltable.close();
}

7 需求四:删除一条数据

删除rowkey为4944191的整条数据。

实现步骤:

  1. 获取HTable对象
  2. 根据rowkey构建delete对象
  3. 执行delete请求
  4. 关闭表
    参考代码:
// 删除rowkey为4944191的整条数据
@Test
public void deleteOneTest() throws IOException {
    // 1. 获取HTable对象
    Table waterBillTable = connection.getTable(TableName.valueOf("WATER_BILL"));
    // 2. 根据rowkey构建delete对象
    Delete delete = new Delete(Bytes.toBytes("4944191"));
    // 3. 执行delete请求
    waterBillTable.delete(delete);
    // 4. 关闭表
    waterBillTable.close();
}

8 需求五:导入数据

8.1 需求

在资料中,有一份10W的抄表数据文件,我们需要将这里面的数据导入到HBase中。

8.2 Import JOB

在HBase中,有一个Import的MapReduce作业,可以专门用来将数据文件导入到HBase中。

用法

hbase org.apache.hadoop.hbase.mapreduce.Import 表名 HDFS数据文件路径

8.3 导入数据

将资料中数据文件上传到Linux中

再将文件上传到hdfs中

hadoop fs -mkdir -p /water_bill/output_ept_10W

hadoop fs -put part-m-00000_10w /water_bill/output_ept_10W

启动YARN集群

start-yarn.sh

使用以下方式来进行数据导入

hbase org.apache.hadoop.hbase.mapreduce.Import WATER_BILL /water_bill/output_ept_10W

8.4 导出数据

hbase org.apache.hadoop.hbase.mapreduce.Export WATER_BILL

/water_bill/output_ept_10W_export

9 需求六:查询2020年6月份所有用户的用水量

9.1 需求分析

在Java API中,我们也是使用scan + filter来实现过滤查询。2020年6月份其实就是从2020年6月1

日到2020年6月30日的所有抄表数据。

9.2 准备工作

  1. 在cn.itcast.hbase.data.api_test包下创建ScanFilterTest类
  2. 使用@BeforeTest、@AfterTest构建HBase连接、以及关闭HBase连接

9.3 实现

实现步骤:

  1. 获取表
  2. 构建scan请求对象
  3. 构建两个过滤器

a) 构建两个日期范围过滤器(注意此处请使用RECORD_DATE——抄表日期比较
b) 构建过滤器列表

  1. 执行scan扫描请求
  2. 迭代打印result
  3. 迭代单元格列表
  4. 关闭ResultScanner(这玩意把转换成一个个的类似get的操作,注意要关闭释放资源)
  5. 关闭表
    参考代码:
// 查询2020年6月份所有用户的用水量数据
@Test
public void queryTest1() throws IOException {
    // 1. 获取表
    Table waterBillTable = connection.getTable(TableName.valueOf("WATER_BILL"));
    // 2. 构建scan请求对象
    Scan scan = new Scan();
    // 3. 构建两个过滤器
    // 3.1 构建日期范围过滤器(注意此处请使用RECORD_DATE——抄表日期比较
    SingleColumnValueFilter startDateFilter = new SingleColumnValueFilter(Bytes.toBytes("C1")
            , Bytes.toBytes("RECORD_DATE")
            , CompareOperator.GREATER_OR_EQUAL
            , Bytes.toBytes("2020-06-01"));
    SingleColumnValueFilter endDateFilter = new SingleColumnValueFilter(Bytes.toBytes("C1")
            , Bytes.toBytes("RECORD_DATE")
            , CompareOperator.LESS_OR_EQUAL
            , Bytes.toBytes("2020-06-30"));
    // 3.2 构建过滤器列表
    FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL
            , startDateFilter
            , endDateFilter);
    scan.setFilter(filterList);
    // 4. 执行scan扫描请求
    ResultScanner resultScan = waterBillTable.getScanner(scan);
    // 5. 迭代打印result
    for (Result result : resultScan) {
        System.out.println("rowkey -> " + Bytes.toString(result.getRow()));
        System.out.println("------");
        List<Cell> cellList = result.listCells();
        // 6. 迭代单元格列表
        for (Cell cell : cellList) {
            // 打印列蔟名
            System.out.print(Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()));
            System.out.println(" => " + Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
        }
        System.out.println("------");
    }
resultScanner.close();
    // 7. 关闭表
    waterBillTable.close();
}

9.4 解决乱码问题

因为前面我们的代码,在打印所有的列时,都是使用字符串打印的,Hbase中如果存储的是int、

double,那么有可能就会乱码了。

System.out.print(Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()));
System.out.println(" => " + Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));

要解决的话,我们可以根据列来判断,使用哪种方式转换字节码。如下:

  1. NUM_CURRENT
  2. NUM_PREVIOUS
  3. NUM_USAGE
  4. TOTAL_MONEY
    这4列使用double类型展示,其他的使用string类型展示。
    参考代码:
String colName = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
System.out.print(colName);
if(colName.equals("NUM_CURRENT")
        || colName.equals("NUM_PREVIOUS")
        || colName.equals("NUM_USAGE")
        || colName.equals("TOTAL_MONEY")) {
    System.out.println(" => " + Bytes.toDouble(cell.getValueArray(), cell.getValueOffset()));
}
else {
    System.out.println(" => " + Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
}

10 # hbase KeyValue结构打印

10.1表内容

hbase(main):003:0> scan ‘tableCreateTest1’

ROW COLUMN+CELL
row1 column=cf1:name, timestamp=1467639285495, value=zq

1 row(s) in 0.0210 seconds

10.2 KeyValue

1.片段代码

Get get = new Get(Bytes.toBytes("row1"));
try {
    Result rs = ht.get(get);
    System.out.println("result size: " + rs.size());
    System.out.println("result.toString: " + rs.toString());
    KeyValue kv = rs.getColumnLatest(Bytes.toBytes("cf1"), Bytes.toBytes("name"));
    System.out.println("kv key: " + Bytes.toString(kv.getKey()));
    System.out.println("kv key: " + kv.getKeyString());
    System.out.println("kv key: " + KeyValue.keyToString(kv.getKey()));
    System.out.println("kv row: " + Bytes.toString(kv.getRow()));
    System.out.println("kv family: " + Bytes.toString(kv.getFamily()));
    System.out.println("kv qualifier: " + Bytes.toString(kv.getQualifier()));
    System.out.println("kv timestam: " + String.valueOf(kv.getTimestamp()));
    System.out.println("kv value: " + Bytes.toString(kv.getValue()));
} catch (IOException e) {
    e.printStackTrace();
}

2.结果

result size: 1
result.toString: keyvalues={row1/cf1:name/1467639285495/Put/vlen=2/mvcc=0}
kv key: row1cf1nameU�F�
kv key:\x00\x04row1\x03cf1name\x00\x00\x01U\xB61\x1B\xF1\x04
kv key: row1/cf1:name/1467639285495/Put
kv row: row1
kv family: cf1
kv qualifier: name
kv timestam: 1467639285495
kv value: zq


相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
SQL 大数据 Shell
大数据HBase JavaAPI工具类
大数据HBase JavaAPI工具类
134 0
|
4月前
|
Java 分布式数据库 Maven
Hbase的javaAPI
Hbase的javaAPI
41 0
|
存储 分布式计算 Java
Hbase JavaAPI使用 1
Hbase JavaAPI使用
143 0
|
存储 分布式计算 安全
javaapi 访问 hbase
javaapi 访问 hbase
138 0
|
分布式数据库 Hbase
JavaAPI如何操作HBase完成CRUD
JavaAPI如何操作HBase完成CRUD
183 0
|
分布式数据库 Apache Hbase
|
4月前
|
Java Shell 分布式数据库
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
137 0
|
1天前
|
分布式计算 Java Hadoop
java使用hbase、hadoop报错举例
java使用hbase、hadoop报错举例
13 3
|
3月前
|
存储 分布式计算 Hadoop
Hadoop节点文件存储HBase设计目的
【6月更文挑战第2天】
50 6
|
3月前
|
存储 分布式计算 Hadoop
Hadoop节点文件存储Hbase高可靠性
【6月更文挑战第2天】
77 2