首页 > 编程语言 >HBase学习6(大量数据的导入及操作java)

HBase学习6(大量数据的导入及操作java)

时间:2023-09-16 18:22:09浏览次数:58  
标签:java Bytes hadoop 导入 org apache import HBase hbase

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

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

1. 导入数据

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

2.再将文件上传到hdfs中

hadoop fs -mkdir -p /water_bill/output_ept_10W

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

3.启动YARN集群

start-yarn.sh

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

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

2.  导出数据

hbase org.apache.hadoop.hbase.mapreduce.Export WATER_BILL /water_bill/output_ept_10W_export

3.对数据进行操作(多条件查询)

3.1先在数据操作包中创建ScanFilterTest类

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

3.2

实现步骤:

1.获取表

2.构建scan请求对象

3.构建两个过滤器

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

  b) 构建过滤器列表

4.执行scan扫描请求

5.迭代打印result

6.迭代单元格列表

7.关闭ResultScanner(这玩意把转换成一个个的类似get的操作,注意要关闭释放资源)

8.关闭表

例子:

package cn.itcast.hbase.data.api_test;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.BinaryComparator;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.util.Bytes;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import java.io.IOException;
import java.util.Iterator;
import java.util.List;

public class ScanFilterTest {
    // Connection是一个重量级的对象,不能频繁去创建Connection
    // Connection是线程安全的
    private Connection connection;
    private TableName TABLE_NAME = TableName.valueOf("WATER_BILL");

    @BeforeTest
    public void beforeTest() throws IOException {
        // 1.    使用HbaseConfiguration.create()创建Hbase配置
        Configuration configuration = HBaseConfiguration.create();
        // 2.    使用ConnectionFactory.createConnection()创建Hbase连接
        connection = ConnectionFactory.createConnection(configuration);
    }

    @Test
    public void scanFilterTest() throws IOException {
        // 1.    获取表
        Table table = connection.getTable(TABLE_NAME);

        // 2.    构建scan请求对象
        Scan scan = new Scan();

        // 3.    构建两个过滤器
        // a)    构建两个日期范围过滤器(注意此处请使用RECORD_DATE——抄表日期比较
        SingleColumnValueFilter startFilter = new SingleColumnValueFilter(Bytes.toBytes("C1")
                , Bytes.toBytes("RECORD_DATE")
                , CompareOperator.GREATER_OR_EQUAL
                , new BinaryComparator(Bytes.toBytes("2020-06-01")));

        SingleColumnValueFilter endFilter = new SingleColumnValueFilter(Bytes.toBytes("C1")
                , Bytes.toBytes("RECORD_DATE")
                , CompareOperator.LESS_OR_EQUAL
                , new BinaryComparator(Bytes.toBytes("2020-06-30")));

        // b)    构建过滤器列表
        FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, startFilter, endFilter);

        // 4.    执行scan扫描请求
        scan.setFilter(filterList);
        ResultScanner resultScanner = table.getScanner(scan);
        Iterator<Result> iterator = resultScanner.iterator();

        // 5.    迭代打印result
        while(iterator.hasNext()) {
            Result result = iterator.next();

            // 列出所有的单元格
            List<Cell> cellList = result.listCells();

            // 5.    打印rowkey
            byte[] rowkey = result.getRow();
            System.out.println(Bytes.toString(rowkey));
            // 6.    迭代单元格列表
            for (Cell cell : cellList) {
                // 将字节数组转换为字符串
                // 获取列蔟的名称
                String cf = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
                // 获取列的名称
                String columnName = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());

                String value = "";

                // 解决乱码问题:
                // 思路:
                // 如果某个列是以下列中的其中一个,调用toDouble将它认为是一个数值来转换
                //1.    NUM_CURRENT
                //2.    NUM_PREVIOUS
                //3.    NUM_USAGE
                //4.    TOTAL_MONEY
                if(columnName.equals("NUM_CURRENT")
                    || columnName.equals("NUM_PREVIOUS")
                    || columnName.equals("NUM_USAGE")
                    || columnName.equals("TOTAL_MONEY")) {
                    value = Bytes.toDouble(cell.getValueArray()) + "";
                }
                else {
                    // 获取值
                    value = Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
                }

                System.out.println(cf + ":" + columnName + " -> " + value);
            }
        }

        // 7.    关闭ResultScanner(这玩意把转换成一个个的类似get的操作,注意要关闭释放资源)
        resultScanner.close();
        // 8.    关闭表
        table.close();

    }

    @AfterTest
    public void afterTest() throws IOException {
        connection.close();
    }
}

 

标签:java,Bytes,hadoop,导入,org,apache,import,HBase,hbase
From: https://www.cnblogs.com/hmy22466/p/17703442.html

相关文章

  • Java基础知识学习笔记总结
    Java学习笔记总结java基础复习1、抽象类可以有构造器,可以有一个非抽象的父类2、垃圾回收机制回收的是堆里面的内存,栈里面的数据自动入栈自动出栈3、引用类型的数据在堆当中,内存中操作的只有栈,new关键字在堆里面分配一块内存4、java中是值传递5、String是不可变字符,即一旦分配......
  • Javaweb、javaEE学习笔记基础知识
    Html1、属性 align:对齐方式 bgcolor:背景颜色target:_blank在新窗口打开_self默认,在相同的框架打开_parent在父框架集中打开_top在整个窗口打开framename在指定的窗口打开2、注释 <!--注释-->3、文件路径 同一目录下:文件名 上级目录:../ 下级目录:从目......
  • java == 和 equals 和 128以下整数
    Integera=127;Integerb=127;System.out.println(a==b);打印值为true而Integera=128;Integerb=128;System.out.println(a==b);打印值为false 因为:在Java中,不应该以这种方式比较对象。当您像a==b那样比较它们时,您比较的是引用,而不是值,值......
  • 无涯教程-JavaScript - ACOSH函数
    描述ACOSH函数返回数字的反双曲余弦值。反双曲余弦是其双曲余弦为数字的值。即ACOSH(COSH(数字))=数字语法ACOSH(number)争论Argument描述Required/OptionalNumberAnyrealnumberequaltoorgreaterthan1.Required适用性Excel2007,Excel2010,Excel2013,E......
  • Java 继承与多态
    1.子类与父类子类:由其他类派生出来的类,父类:包含一些共同特征。子类继承父亲的所有非私有成员。子类只能继承一个父亲子类可以直接调用父类的非私有方法。2.继承语法extendpublicclassMargicionextendsRole{@Overridepublicvoidshowfight(){Sys......
  • 无涯教程-JavaScript - ABS函数
    描述数字除以除数后,ABS函数将返回余数。输出与除数的符号相同。语法MOD(number,divisor)争论Argument描述Required/OptionalNumberThenumberforwhichyouwanttofindtheremainder.RequiredDivisorThenumberbywhichyouwanttodividenumber.Requir......
  • java安装与卸载
    Java三大版本JavaSE:标准版JavaME:嵌入式开发JavaEE:企业级开发JDK,JRE,JVMJDK:JavaDevelopmentKitJava开发工具JRE:JavaRuntimeEnvironmentJava运行环境JVM:JavaVirtualMachineJava虚拟机(一次开发,到处运行)java下载与安装  官网:https://www.java.com/zh-CN/downl......
  • 无涯教程-JavaScript - VLOOKUP函数
    描述当需要在表中或按行查找内容时,请使用VLOOKUP。组织数据,以便您查找的值在要查找的返回值的左侧。语法VLOOKUP(lookup_value,table_array,col_index_num,[range_lookup])争论Argument描述Required/Optionallookup_value您要查找的值。您要查找的值必须在ta......
  • JavaScript 代码整洁技巧
    前言为什么代码要整洁?代码质量与整洁度成正比。有的团队在赶工期的时候,不注重代码的整洁,代码写的越来越糟糕,项目越来越混乱,生产力也跟着下降,那就必须找更多人来提高生产力,开发成本越来越高。整洁的代码是怎样的?清晰表达意图、消除重复、简单抽象、能通过测试。换句话......
  • IDEA使用连接JDBC连接带有phoenix加持的hbase数据库
    1、首先要保证自己的phoenix已经下载,且能够正常运行所谓正常运行,即能够正常地使用增删改查的相关操作,而不产生错误,比如不允许啥啥的情况;2、注意phoenix的命令格式(需要保证表中必须有primarykey)增加/修改(在phoenix里面,这两种情况被合并了,若是primarykey已经存在,那么就是修改......