protobuf实现Hbase数据压缩

目录

  • 前置
  • HBase数据压缩
  • 效果
  • 获取数据(反序列化)

前置

安装说明
使用说明
HBaseDDL和DML操作

HBase数据压缩

问题
在上文的datain中原文
每次写入数据会写入4个单元格的内容,现在希望能对其进行筛减,合并成1格,减少存储空间(序列化)
在这里插入图片描述
datain2
此处仅修改了插入方法之前的内容,将数据合并,对于插入方法没有做修改,其他内容仿照之前的即可。

package org.wunaiieq;

import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;
import org.wunaiieq.util.MyPhone;

import java.text.SimpleDateFormat;
import java.util.*;

public class datain2 {
    public static Connection connection = HBaseConnection.connection;
    public static Random random=new Random();
    public static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static String getPhone(String prefix) {
        return prefix + String.format("%08d", random.nextInt(99999999));
    }

    private static String getData(int year) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, 0, 1);
        calendar.add(Calendar.MONTH, random.nextInt(12));
        calendar.add(Calendar.DAY_OF_MONTH, random.nextInt(31));
        calendar.add(Calendar.HOUR_OF_DAY, random.nextInt(12));
        Date time = calendar.getTime();
        return simpleDateFormat.format(time);
    }

    public static void main(String[] args) throws Exception {
        Table table = connection.getTable(TableName.valueOf("wunaiieq", "phone_log"));

        List<Put> putList =new ArrayList<Put>();
        //10个用户
        for (int i = 0; i < 10            ; i++) {
            String phonenumber = getPhone("158");
            for (int j = 0; j < 1000; j++) {
                putList.clear();
                String dnum = getPhone("199");
                int length = random.nextInt(200) + 1;
                int type = random.nextInt(2);
                String date = getData(2050);
                String rowkey = phonenumber + "_" + (Long.MAX_VALUE - simpleDateFormat.parse(date).getTime()) + i + j;
                Put put =new Put(Bytes.toBytes(rowkey));
                //构造器
                MyPhone.Phone.Builder builder = MyPhone.Phone.newBuilder();
                //数据写入
                builder.setDnum(dnum);
                builder.setLength(length);
                builder.setDate(date);
                builder.setType(type);
                //构造器创建phone对象
                MyPhone.Phone phone = builder.build();
                put.addColumn(Bytes.toBytes("basic"),Bytes.toBytes("info"),phone.toByteArray());
                putList.add(put);
            }
            table.put(putList);
        }
    }

}

其他内容
修改pom.xml——增加对protobuf的依赖
导入myPhone.java——protobuf生成的java文件
编写HbaseDML.java(参考专栏博客)

效果

原有大小
在这里插入图片描述
更新后
在这里插入图片描述

获取数据(反序列化)

数据存储格式已经修改,因此获取数据的方式需要改变
在这里插入图片描述
Using2.java

package org.wunaiieq;


import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.wunaiieq.util.MyPhone;

import java.io.IOException;
import java.text.SimpleDateFormat;

public class Using2 {

    public static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public static Connection connection0 = HBaseConnection.connection;
    static Table table;

    static {
        try {
            table = connection0.getTable(TableName.valueOf("wunaiieq", "phone_log"));
            System.out.println(table);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void scanProtocBuf(String phoneNumber) throws Exception {
        String startRow = phoneNumber+"_"+(Long.MAX_VALUE-
                simpleDateFormat.parse("2099-04-01 00:00:00").getTime());
        String stopRow = phoneNumber+"_"+(Long.MAX_VALUE-
                simpleDateFormat.parse("2000-03-01 00:00:00").getTime());
        Scan scan = new Scan();
        scan.withStartRow(Bytes.toBytes(startRow));
        scan.withStopRow(Bytes.toBytes(stopRow),true);
        //执行查询
        ResultScanner resultScanner = table.getScanner(scan);
        //解析resultScanner
        for(Result result:resultScanner){
            Cell[] cells = result.rawCells();
            //获取值
            byte[] phoneInfoBytes = CellUtil.cloneValue(cells[0]);
            //将字节数据中的数据反序列化为MyPhone.Phone对象
            MyPhone.Phone phone = MyPhone.Phone.parseFrom(phoneInfoBytes);
            System.out.print(phone.getDnum()+"--");
            System.out.print(phone.getType()+"--");
            System.out.print(phone.getLength()+"--");
            System.out.println(phone.getDate()+"--");
        }
    }


    public static void main(String[] args) throws Exception {
        String phoneNumber0 = "15894163362";
        scanProtocBuf(phoneNumber0);
        String phoneNumber1 = "15898559729";
        scanProtocBuf(phoneNumber1);
        String phoneNumber2 = "15807236902";
        scanProtocBuf(phoneNumber2);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/929137.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

爬虫专栏第二篇:Requests 库实战:从基础 GET 到 POST 登录全攻略

简介&#xff1a;本文聚焦 Requests 库的强大功能与应用实战。首先介绍其安装步骤及版本选择要点&#xff0c;随后深入讲解 GET 请求&#xff0c;以百度页面为例&#xff0c;展示如何发起基本 GET 请求、巧妙添加 headers 与参数以精准搜索&#xff0c;以及正确设置 encoding 避…

【Leetcode】19. 删除链表的第N个节点

【Leetcode】19. 删除链表的第N个节点 1. 题目介绍2. 方法一&#xff1a;计算链表长度逻辑流程:代码复杂度分析 1. 题目介绍 题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,…

工业齐套管理虚拟现实仿真模拟软件

工业齐套管理虚拟现实仿真模拟软件是与法国最大的汽车制造商合作开发的一款虚拟现实仿真模拟软件&#xff0c;借助身临其境的虚拟现实环境&#xff0c;无需停止生产线&#xff0c;即可模拟仓库和提货区域。 工业齐套管理虚拟现实仿真模拟软件不仅适用于汽车工业&#xff0c;安全…

【嘟嘟早教卡】 小程序源码分享带后台管理

【嘟嘟早教卡】是专门为 3-6 岁婴幼儿童学习普通话、英语研发的早教启蒙认知识字的小程序 小程序由 Taro 及 Tailwind CSS 构建而成&#xff0c;后台管理使用 Laravel 及 Tailwind CSS 想法源于小时候玩的认知卡片&#xff0c;基本大部分家庭都买过认知卡片&#xff0c;我按照…

概率论相关知识随记

作为基础知识的补充&#xff0c;随学随记&#xff0c;方便以后查阅。 概率论相关知识随记 期望&#xff08;Expectation&#xff09;期望的定义离散型随机变量的期望示例&#xff1a;掷骰子的期望 连续型随机变量的期望示例&#xff1a;均匀分布的期望 期望的性质线性性质期望的…

FastAPI 响应状态码:管理和自定义 HTTP Status Code

FastAPI 响应状态码&#xff1a;管理和自定义 HTTP Status Code 本文介绍了如何在 FastAPI 中声明、使用和修改 HTTP 状态码&#xff0c;涵盖了常见的 HTTP 状态码分类&#xff0c;如信息响应&#xff08;1xx&#xff09;、成功状态&#xff08;2xx&#xff09;、客户端错误&a…

oracle 11g中如何快速设置表分区的自动增加

在很多业务系统中&#xff0c;一些大表一般通过分区表的形式来实现数据的分离管理&#xff0c;进而加快数据查询的速度。分区表运维管理的时候&#xff0c;由于人为操作容易忘记添加分区&#xff0c;导致业务数据写入报错。所以我们一般通过配置脚本或者利用oracle内置功能实现…

机器学习深入剖析逻辑回归算法

一、引言 在机器学习领域&#xff0c;逻辑回归&#xff08;Logistic Regression&#xff09;是一种极为经典且应用广泛的算法。尽管其名称带有 “回归” 二字&#xff0c;但实际上它主要用于解决分类问题&#xff0c;并且在众多领域都发挥着重要作用。接下来&#xff0c;让我们…

如何加强游戏安全,防止定制外挂影响游戏公平性

在现如今的游戏环境中&#xff0c;外挂始终是一个困扰玩家和开发者的问题。尤其是定制挂&#xff08;Customized Cheats&#xff09;&#xff0c;它不仅复杂且隐蔽&#xff0c;更能针对性地绕过传统的反作弊系统&#xff0c;对游戏安全带来极大威胁。定制挂通常是根据玩家的需求…

6.824/6.5840 Lab 1: MapReduce

宁静的夏天 天空中繁星点点 心里头有些思念 思念着你的脸 ——宁夏 完整代码见&#xff1a; https://github.com/SnowLegend-star/6.824 由于这个lab整体难度实在不小&#xff0c;故考虑再三还是决定留下代码仅供参考 6.824的强度早有耳闻&#xff0c;我终于也是到了挑战这座高…

解决Jupyter Notebook无法转化为Pdf的问题(基于Typora非常实用)

笔者在完成各项作业和做笔记时&#xff0c;经常用到jupyter notebook&#xff1b;其因为可以同时运行python并提供格式化的数字公式的输入方式&#xff0c;得到了广大用户的喜爱。 当我们想要将.ipynb文件导出为pdf时&#xff0c;有两种常用方法。 1.Ctrlp 2.通过File ->…

[在线实验]-RabbitMQ镜像的下载与部署

镜像下载 docker的rabbitmq镜像资源-CSDN文库 加载镜像 docker load --input rabbitmq.tar 给镜像打标签 这里发现镜像名为none&#xff0c;需要给镜像重命名下 docker tag [镜像id] [新镜像名称]:[新镜像标签] docker tag ebaf409ffbe2 rabbitmq:management 运行镜像…

【JVM】—G1 GC日志详解

G1 GC日志详解 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 文章目录 G1 GC日志详解1 G1 GC周期2 G1日…

ADBC 查询语法介绍:EXECUTE_QUERY

可使用 CL_SQL_STATEMENT 类的以下实例方法执行查询&#xff1a; EXECUTE_QUERY 该方法有一个字符串类型的强制输入参数 STATEMENT&#xff0c;必须向其传递语法正确的 SELECT 语句。与 DML 语句一样&#xff0c;SET_PARAM 方法可用于将 ABAP 数据对象绑定到占位符。 查询结…

线程信号量 Linux环境 C语言实现

既可以解决多个同类共享资源的互斥问题&#xff0c;也可以解决简易的同步问题 头文件&#xff1a;#include <semaphore.h> 类型&#xff1a;sem_t 初始化&#xff1a;int sem_init(sem_t *sem, int pshared, unsigned int value); //程序中第一次对指定信号量调用p、v操…

springboot+mybatis对接使用postgresql中PostGIS地图坐标扩展类型字段

方案一&#xff08;完全集成和自动解析&#xff09;&#xff1a; <dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId></dependency> 使用 org.postgresql.geometric包下的 PGpoint 类来接收数据库中POINT…

21个Python脚本自动执行日常任务(1)

引言 作为编程领域摸爬滚打超过十年的老手&#xff0c;我深刻体会到&#xff0c;自动化那些重复性工作能大大节省我们的时间和精力。 Python以其简洁的语法和功能强大的库支持&#xff0c;成为了编写自动化脚本的首选语言。无论你是专业的程序员&#xff0c;还是希望简化日常工…

【Python网络爬虫笔记】6- 网络爬虫中的Requests库

一、概述 Requests 是一个用 Python 语言编写的、简洁且功能强大的 HTTP 库。它允许开发者方便地发送各种 HTTP 请求&#xff0c;如 GET、POST、PUT、DELETE 等&#xff0c;并且可以轻松地处理请求的响应。这个库在 Python 生态系统中被广泛使用&#xff0c;无论是简单的网页数…

网站维护记录

服务器重启&#xff0c;网站打不开&#xff1a;chown -R manager:manager /run/php-fpm/www.sock wordpress升级需设置ftp&#xff1a; // 设置权限0777 //define("FS_METHOD", "direct"); //define("FS_CHMOD_DIR", 0777); //define("…

利用Python爬虫精准获得Amazon商品详情数据

在大数据时代&#xff0c;精准的数据获取是电商分析、市场研究和竞争情报收集的关键。Amazon作为全球最大的电商平台之一&#xff0c;其商品详情页面蕴含着丰富的信息。本文将详细介绍如何使用Python爬虫技术精准获取Amazon商品详情数据&#xff0c;并提供实用的代码示例。 1. …