首页 > 其他分享 >使用布尔代数解耦业务

使用布尔代数解耦业务

时间:2023-05-24 20:45:11浏览次数:32  
标签:... 布尔代数 mapping 数值 业务 关系数据 job 使用 数据

业务背景

有这样一个场景,数据供应商定期提供一次海量的数据,把这些数据存储到 Hadoop hive 中去,但是这些数据和我们系统是不通用的,需要先进行分析以便于我们的系统能够识别这些数据,具体的分析过程省略,最后生成一个 mapping 关系数据,存储着两边的标志 key 和数据的生命周期。

目前的系统设计分为两个job,job 1 解析数据生成 mapping 关系数据存储到关系型数据库 SQL Server 中;job 2 存储这些数据到 Hadoop hive 中。

问题介绍

job 2 保存这些数据的时候需要根据 job 1 的 mapping 关系数据进行分类保存。当 API 查询使用 Hadoop hive 里面的数据的时候,需要再一次根据 mapping 关系数据里面的生命周期提取对应的数据。

job 1 的结果被严重依赖,而且供应商提供的数据本身也存在小概率的错误,一旦出现问题,导致整个业务崩溃,或者最终的结果出错。

解决问题

这种情况下,亟需将两个 job 解耦,job2 只需要专心存储数据,不要再依赖 mapping 关系数据。
对 job1 升级改造,分析数据的时候不仅仅解析出 mapping 关系数据,同时也要知道对应的数据是否存在且符合生命周期,如果不符合,那么要回溯历史数据,提供最近一次符合条件的数据。

解决方案

对于海量的数据,不适合全部存储在关系型数据库中,用布尔值去表示一个数值是否存在即可,数据文件就变成了一行行的布尔值。

行数 数值1 数值2 ... 数值N
1 1 0 1 1
2 0 1 0 0
... 0 1 0 0
M 0 1 0 0

数值 N 目前最大还不超过 5000 个,那么一行数据最多 5000/8 = 625 byte 便可以存下了,SQL Server 中一行数据一般不超过 4 KB,所以余量是非常充足的,即使 N 以后增长到 32000 个也不影响性能。

行数 M,目前一次最大是 1,000,000,那么这一次的整个索引大小是
1,000,000 * 625 / 1024 / 1024 = 596 MB.
完全可以接受。

PK 是 mapping 关系中的标志 key,数据的主键。
Time 是数据的生命周期,这里简化成一个时间。
DataIndex 一行布尔值相当于是这行数据的索引,这里要把 布尔值 顺序颠倒过来,数值N在左边,数值1在右边,便于以后拓展长度。

PK Time DataIndex
1 20230405 11...01
2 20230112 00...01
... 20230102 00...01
M 20230119 00...01

那么现在想要知道某个时间下某个或者某些数值,就可以用 布尔运算 从索引中迅速定位到了。
例如 q1:20230112 的 factor 2
查询语句

select * from table a
where a.Time <= '20230112' and (a.DataIndex & 0x10) == 0x10

通过这个索引的查找就可以精确定位到某个数值存储在哪个 pk 和 time 那里了,那么只需要简单的从 Hadoop hive 中对应的位置取数据即可。

因此实现了 job1 和 job2 的解耦,job 2 再也不用担心 mapping 关系数据是否准确,生命周期如何处理这些问题了,它只需要做好它擅长的存储工作即可。

标签:...,布尔代数,mapping,数值,业务,关系数据,job,使用,数据
From: https://www.cnblogs.com/kexxxfeng/p/17289529.html

相关文章

  • [转]Pelco-D协议使用
    1.Pelco-D协议格式如下图所示:2.通用示例为:水平向右控制FFaddress0002Hspeed00checksum水平向左控制FFaddress0004Hspeed00checksum俯仰向上控制FFaddress000800Vspeedchecksum俯仰向下控制FFaddress001000Vspeedchecksum变倍加控制FFaddress00......
  • 【踩坑记录】autojs使用while(1)导致broadcast无法正常执行
    autojs中的死循环操作最好使用setInterval而不是,while(1)。 while(1)会导致其他语句无法执行,这里面包括了信号相关的,比如今天踩得坑: 用events.broadcast.emit发出信号后,相应的on语句无法正常执行,后来才发现原来是为了一个用while(1)来执行死循环导致整个线程全部死在了这里,......
  • 【IntelliJ IDEA】idea中的插件之一:Free Mybatis plugin跳转插件的使用(方便在Dao接口
    本文目录一、安装二、使用最近在使用一个非常好用的跳转插件,用着很顺手,效率比之前提高了很多。之前使用MyBatis框架或者是在IDEA中,发现Mapper接口和XML文件之间跳转十分的麻烦,我之前经常的操作是在Mapper接口中将接口名称复制一下,然后去查找对应的XML文件,打开后CRTL+F查找对应的xml......
  • 2023-05-24:为什么要使用Redis做缓存?
    2023-05-24:为什么要使用Redis做缓存?答案2023-05-24:缓存的好处买啤酒和喝啤酒的例子可以帮助我们理解缓存的好处。假设你在超市里买了一箱啤酒,如果你需要每次想喝啤酒就去超市购买,无疑会浪费很多时间和精力。而如果你将一部分啤酒放在家中的冰箱里,每次想喝啤酒时就从冰箱里取出来,那......
  • Docker容器使用和操作
    1、容器概念1.1、什么是容器容器(Container):在docker中指的是从镜像创建的应用程序运行实例。可以将容器看作将一个 应用程序及其依赖环境打包 而成的集装箱。容器的实质是进程,与直接在主机执行不同,容器进程在属于自己的独立的命名空间内运行。这种特性使得容器封装的应用程序比直......
  • 2023-05-24:为什么要使用Redis做缓存?
    2023-05-24:为什么要使用Redis做缓存?答案2023-05-24:缓存的好处买啤酒和喝啤酒的例子可以帮助我们理解缓存的好处。假设你在超市里买了一箱啤酒,如果你需要每次想喝啤酒就去超市购买,无疑会浪费很多时间和精力。而如果你将一部分啤酒放在家中的冰箱里,每次想喝啤酒时就从冰箱里取出......
  • 使用ffmpeg将内存中的裸流打包成可播放的MP4文件,并输出到内存中
     前两天项目上有个需求,要求大概是这样的,输入端是一帧一帧的h264裸流(本示例只支持h264裸流,h265可基于本示例自己开发,在此我就不过多阐述了)和一个时间,要求输出根据这个时间来产生一个前后各延伸一段时间的视频(伴随录像),且伴随录像是可直接播放的MP4文件。但是产生的视频文件不是直接......
  • JQuery框架 -- JQuery怎么使用和各个版本的区别、JQuery对象和JS对象区别、JQuery选择
    目录一、概念:一个JavaScript框架。简化JS开发。二、快速入门三、JQuery对象和JS对象区别与转换四、选择器:筛选具有相似特征的元素(标签)4.1、基本操作学习4.2、选择器分类    1.基本选择器      2.层级选择器      3.属性选择器      4.过滤......
  • Python3源码编译和使用静态链接库lib&动态链接库dll详细介绍
    说明:本文主要介绍:1.python3源码的下载和编译内核工程(pythoncore)2.编译的lib和dll使用例子。若需要编译源码PCBuild下其他python工程,类似参考内核工程(pythoncore)编译的方式进行配置即可。一.python源码下载1.进入python官方网站:PythonSourceReleases|Python.org2.选择......
  • 边缘计算AI硬件智能分析网关V1版的接入流程与使用步骤
    我们的AI边缘计算网关硬件——智能分析网关目前有两个版本:V1版与V2版,两个版本都能实现对监控视频的智能识别和分析,支持抓拍、记录、告警等,在AI算法的种类上和视频接入上,两个版本存在些许的区别。V1的基础算法有人体检测、区域入侵检测、戴口罩识别、安全帽识别;V2目前有15种算法,包括......