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

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

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

其一、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》

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MANIFEST.MF是个什么?

    MANIFEST.MF是个什么?MANIFEST.MF是个什么?写这篇文件主要记录JRA文件里面到底是什么?然后MANIFEST.MF又是什么?Springboot如何只有Main方法就可以运行的?Springboot项目打包

    2022年7月1日
    18
  • UICollectionView的单选

    UICollectionView的单选//点击选定-(void)collectionView:(UICollectionView*)collectionViewdidSelectItemAtIndexPath:(NSIndexPath*)indexPath{    JFCollectionViewCell*cell=(JFCollectionViewCell*)[collection

    2022年5月29日
    40
  • CTF-UPX脱壳加壳讲解;(详细版)

    CTF-UPX脱壳加壳讲解;(详细版)在做CTF-RE题的时候,下载的题目附件会发现缺少函数方法的现象,说明这个文件就被加壳处理了;这个是加壳状态下的;脱壳后~~~~~~~如何发现是加壳的呢?除了开头所描述的方法,还有第二种用ExeinfoPE软件查看附件信息;此时这个软件就提示我们这个附件是UPX加壳处理的;二.脱壳这里我只讲一种方法(因为我只会一种方法-.-)首先下载好打包好的UPX脱壳工具,解压下载好:讲一下用法吧在这个文件夹当中输入cmd进入;输入upx.exe-h有如下反应:

    2022年7月19日
    69
  • mysql decimal 实现_mysql decimal数据类型转换的实现示例

    mysql decimal 实现_mysql decimal数据类型转换的实现示例mysqldecimal数据类型转换的实现示例发布时间:2021-02-1408:40:00来源:亿速云阅读:85作者:小新小编给大家分享一下mysqldecimal数据类型转换的实现示例,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!最近在工作遇到数据库中存的数据类型是:decimal(14,4)遇到的问题是:当我使用python读取到内存中时,总是带着decimal…

    2022年7月17日
    18
  • PyCharm撤销快捷键以及注释快捷键

    PyCharm撤销快捷键以及注释快捷键返回快捷键:当写程序时,不小心删掉了某一行程序,Ctrl+Z或者Ctrl+Shift+Z快捷键即可返回上一步注释快捷键:选中要注释的内容然后Ctrl+/

    2022年8月27日
    7
  • 开始laravel项目+理解

    开始laravel项目+理解一.laravel运行理解Ⅰ.开始,public/index.php此文件有两个作用。①:作为入口的起点,引导构建服务所需要的一切(包括路由,服务容器之类的)。②:作为所有请求的必经之路。请求经过此文件,会被“指派”到合适的路由,中间件等等进行处理。tips:所以用phpstudy的时候,记得设置一下①指定项目的根目录。②指定下路由。我用的nginx,设置的vhost.config文件。画起第一行用以指定项目的根目录,就apache的www文件的意思。第二行是指定所有请求最终会定向

    2022年5月7日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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