列存储中常用的数据压缩算法

列存储中常用的数据压缩算法列存储,作为一种针对数据查询和数据分析设计的数据存储策略,在“大数据”越来越普及的今天可以说是相当地火热。相较于行存储,列存储的最大优势有二,其一就是查询涉及到数据库的哪几个列就读哪几个列,不读一点与查询不相关的列,大大减少了数据的读取,其二就是数据库数据分为多个独立的列来存储,相同数据类型的数据连续存储在一起,易于数据压缩,而这再次减少了数据的读取。以上正是列存储在处理数据查询和数据分析方面的天

大家好,又见面了,我是你们的朋友全栈君。列存储,作为一种针对数据查询和数据分析设计的数据存储策略,在“大数据”越来越普及的今天可以说是相当地火热。相较于行存储,列存储的最大优势有二,其一就是查询涉及到数据库的哪几个列就读哪几个列,不读一点与查询不相关的列,大大减少了数据的读取,其二就是数据库数据分为多个独立的列来存储,相同数据类型的数据连续存储在一起,易于数据压缩,而这再次减少了数据的读取。以上正是列存储在处理数据查询和数据分析方面的天然优势,其中也有很多值得探讨的东西。关于前者,本博主涉其未深,不便胡说,倒是近日通过阅读些许文章晓得了几种列存中的数据压缩算法,可以写出来与众看客们分享一二三点。

其一、Run-Length Encoding,其核心思想是将一个有序列中相同的列属性值转化为三元组(列属性值,在列中第一次出现的位置,出现次数),适用于列有序或者列可以转化为有序且列中distinct值较少的情况。图一给出了一个简单的示意图,其中一个排好序的列仅包含两个distinct值,通过Run-Length Encoding,整个列使用两个简单的三元组就可以表示了。使用这种算法,一个列可以转化为多个三元组,通过在这些三元组上构建B树索引就可以轻松地实现对该列的管理。

列存储中常用的数据压缩算法

其二、Bit-Vector Encoding,其核心思想是将一个列中所有相同列属性的值转化为二元组(列属性值,该列属性值出现在列中位置的Bitmap),适用于列无序且无法转化为有序但列中distinct值较少的情况。图二给出了一个简单的示意图,其中一个无序的列仅包含两个distinct值,8000这个值分别出现在列中的0、3、4、6四个位置,3000这个值分别出现在列中的1、2、5三个位置,使用位图便可以表示出来,通过Bit-Vector Encoding,整个列使用两个简单的二元组就可以表示了。使用这种算法,一个列可以转化为多个二元组,通过在这些二元组上构建B树索引就可以轻松地实现对该列的管理。此外,如果列中distinct值较少,那么二元组中的位图就会很稀疏,所以位图还可以使用上面的Run-Length Encoding进行二次压缩。

列存储中常用的数据压缩算法

三、Dictionary Encoding,其核心思想就是利用简短的编码代替列中某些重复出现的字符串,通过维护一个编码与被替代字符的映射就可以快速确定编码指向的是哪个字符串,这个映射也就是所谓的Dictionary,适用于列中存在很多相同字符串的情况。这里不妨以Google在VLDB2012上发表的论文为例来说明Dictionary Encoding的妙处。图三给出了该论文中一个示例(原论文中示例有误,即图中红圈标注处,可忽略),其中一个名为search_string的列被分成了三个块(chunk),在每个块中都存在重复的查询字符串。

为了压缩每个数据块的大小,首先创建一个全局字典表global-dictionary,该表中存储search_string列中所有的distinct字符串,且每个字符串均对应一个全局id,譬如amazon的全局id就是它前面的1。其次,每个块中也创建一个块字典表chunk-dict,该表中存储了块中所有的distinct字符串在global-dictionary中的全局id,且每个全局id均对应了一个块id,通过这种二级字典表的方式,一个字符串就可以通过全局字典表映射到一个全局id,再通过块字典表映射到一个块id。所以,此时块中也不再存储真正的查询字符串,而是存储查询字符串对应的块id,即图中所示的elements。譬如要查询chunk 0中第4个element真正代表的值时,需要使用该element的值4到块字典表中查询得到它对应的全局id为12,然后在使用12到全局字典表中查询得到12对应的字符串是“yellow pages”。使用这种算法,一个存储了查询字符串的列就转化成了存储32位整型值的列,数据空间大大缩小。

列存储中常用的数据压缩算法

以上便是列存储中常见的几种数据压缩算法,当然这些算法都是列存储中的专用方法,其他像Snappy、zlib、LZO等通用压缩算法在列存储中也有十分广泛的应用。通常针对同一个列往往可以使用多种压缩算法进行多次压缩,效果更好!

参考文献:《C-Store: A Column-oriented DBMS》和《Processing a Trillion Cells per Mouse Click》

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159133.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 架构之业务架构[通俗易懂]

    架构之业务架构[通俗易懂]业务架构之产品经理的职责产品经理的职责用户的原始需求往往是零散和碎片化的,产品经理的职责就是:告诉用户,系统长什么样子;告诉开发,他要实现什么功能。产品经理定义了系统的外表。产品经理的职责:1、收集用户的原始需求,2、梳理成一个个业务流程,每个业务流程由多个业务步骤组成。一个业务步骤包含三部分的内容:输入、输出和业务功能。3、需求梳理好后,产品经理会把每个步骤具体化为页面原型。在原型中,会以直观的方式给出各个步骤的输入或输出,以及用户的操作过程,最后再把这些页面串起来,形成一个业

    2022年10月12日
  • 一元线性回归方程公式_用普通最小二乘法估计经典线性模型

    一元线性回归方程公式_用普通最小二乘法估计经典线性模型概述别看公式多,其实很简单最小二乘法其实又叫最小平方法,是一种数据拟合的优化技术。实质上是利用最小误差的平方寻求数据的最佳匹配函数,利用最小二乘法可以便捷的求得未知的数据,起到预测的作用,并且是的这些预测的数据与实际数据之间的误差平方和达到最小。一般应用在曲线拟合的目的上。原理本篇文章不考虑其他方面的应用,我们用最简单的实例说明最小二乘法的工作原理与其内在含义。当我们在研究两个…

  • MySQL 5.7中的新功能

    MySQL 5.7中的新功能

  • modelsim se 10.5安装教程

    modelsim se 10.5安装教程modelsimse10.5安装教程简介modelsim10.5是由mentorgraphics公司推出的一款具备强大的仿真性能与调试能力的HDL设计验证环境,也是唯一的单内核支持VHDL和Verilog混合仿真的仿真器,提供最友好的调试环境,采用直接优化的编译技术、Tcl/Tk技术、和单一内核仿真,并且具有个性化的图形界面和用户接口,能够为用户加快调试提供强有力的手段。而且软件全面支持VHDL和Verilog语言的IEEE标准,以及IEEEVITAL1076.4-95标准,与C语言功能调

  • 不平衡数据处理之SMOTE、Borderline SMOTE和ADASYN详解及Python使用

    不平衡数据处理之SMOTE、Borderline SMOTE和ADASYN详解及Python使用  不平衡数据在金融风控、反欺诈、广告推荐和医疗诊断中普遍存在。通常而言,不平衡数据正负样本的比例差异极大,如在Kaggle竞赛中的桑坦德银行交易预测和IEEE-CIS欺诈检测数据。对模型而言,不均衡数据构建的模型会更愿意偏向于多类别样本的标签,实际应用价值较低,如下图所示,为在不均衡数据下模型预测的概率分布。  不平衡数据的处理方法,常见方法有欠采样(under-sampling)和过采样(…

    2022年10月21日
  • 执行python程序的两种方式

    执行python程序的两种方式执行python程序的两种方式交互式python是高级(解释型)语言,写一句执行一句。命令行式python和python解释器是一种东西,我们说的打开python就是打开python解释器。

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号