行转列和列转行的区别就是:
某一列有多个重复的数据,对着一列进行分组之后,其他的列数据能够和这一行转换之后的数据对应上,这就是行转列。
列转行就是将某一没有重复数据的列进行转换之后变成可以与其他数据对应起来的有重复数据的列,就是列转行。
例如:
1、行转列:
2、列转行:
前言
最近学习了hbase,其中涉及的到知识就是hbase采用了列式存贮,而用惯了mysql的我当然一脸懵逼,于是有了本篇文章,本文不是论文,所有涉及的知识点他人都有讲,我只是为了记录一下,如果想要看论文性质的,推荐一篇为《Column-Stores vs. Row-Stores: How Different Are They Really?》,可以自行观看,其中有大量的测试,分析,十分详尽。
存贮数据的方式
第一个对比的就是存贮数据的方式。
现来说行式。比如mysql,我们通过观察知道,他是一行一行的存贮的。为了说明这个问题,我们画个图,草图。
从这个图我们看出,每一行都有id,name,age,sex属性,每一行的所有属性连贯起来存贮起来。即使某一个行某一个字段为空,也会占用一个存贮位置。每一个画绿线的部分里面的数据都被串起来存贮了。比如在北方,蒜这种东西都是被绳子串起来来的,那你现在就可以想象每个绳子串起来的蒜都有id,name,age,sex这四头蒜。
然后再来看列式存贮。画个草图,嗯,是的,很草很草的图。
看上图,这就是列式存贮,发现没有,他是一列都是同一个属性的,是的,看图说话,我感觉已经很明白了哦。再来说到蒜,那么你现在就可以想象每个绳子上的蒜都是同一种,比如这条绳子上的蒜全是id,另外一条绳子上的蒜都是name,以此类推。
是不是很明白的样子。
查询方面的对比
第二个对比的就是查询方面。
先来说行式数据库,通过上面我们知道数据是一行一行的存贮起来的,我们如果想要查询,那么就会一行行的扫描,从而得到我们的数据。还用上面的例子,假定我们只想要name这一行的数据,我们是不是查询的时候也必须把其他的数据顺便给查出来了,因为他们是一起的。那我们就知道了,即使我们只想要一行的数据,也得整行扫描,多的那些数据都是磁盘IO,不得不需要加上额外的不需要的数据。
然后再来说列式数据库,通过上面我们也知道了列式数据库式按照一列一列来存贮的。再来看上面的那个查询问题,我们依旧只想要name这一列,这个时候我们就只需要把这一列查询出来就行了,其他的没有关系的我们也不关心,是不是瞬间就减少了数据量呀,这个优点尤其是在海量数据的时候尤其明显,查询速度秒杀行式数据库。
接着我们再返回行式数据库想一下,比如mysql在做查询优化的时候,最常用的手段就是建立索引,可是我们想一想,数据量一旦大的时候,索引也会成倍的增长。
而列式数据库则不然,他的每一列就是索引,减少了额外建立索引的内容。
当然了,如果我们的需求就是查询所有字段,那个这个时候列式数据库的处理方式就是先把所有列查询出来,然后再拼接起来,速度方面是比不上行式数据库的。不过我们既然用到了列式数据库,那么我们的场景需求就是大量数据,一般在大数据领域,进行所有字段的查询的这个要求少之又少,所以这个缺点我们需要正式,但是我们也可以忽略。
压缩比较
行式数据库因为存贮数据是一行行的来存贮,而每一行数据的差异性太大,所以压缩比很小。列式数据库则不同,因为是按照一列列来存贮,每一列的数据的相同性极高,这就为压缩埋下了很好的种子,压缩比可以达到很大,可以达到5~20倍以上。
接下来看一下网上的一个图来说明问题。
我认为这个压缩比是这种列式存贮在面对海量数据存贮查询的时候灵魂。因为拥有超高的压缩比,在磁盘iO传输的时候,据统计可以达到行式的100倍以上。
当然了,拥有超高的压缩比,另外一方面可以减少磁盘的使用率,不过在现在这个硬盘不值钱的年代,这个优点也不是啥大优点了,最重要的还是在磁盘IO的传输上。
应用场景比较
行式数据库主要应用于传统的业务场景中
列式数据库则应该发挥他查询速度方面的优势,主要用于海量数据分析一类的方面。
总结
以上就是本文全部的内容了,如果读者有补充,也欢迎在下方留言,与几方便也与他方便,共同进步咯。
行转列和列转行的区别就是:
某一列有多个重复的数据,对着一列进行分组之后,其他的列数据能够和这一行转换之后的数据对应上,这就是行转列。
列转行就是将某一没有重复数据的列进行转换之后变成可以与其他数据对应起来的有重复数据的列,就是列转行。
例如:
1、行转列:
2、列转行:
转载于:https://www.cnblogs.com/qadyyj/p/5599828.html
行存储和列存储的区别
a.
行存储的写入是一次完成,数据的完整性因此可以确定。
列存储需要把一行记录拆分成单列保存,写入次数明显比行存储多。
行存储在写入上占有很大的优势
b.
行存储是在指定位置写入一次,列存储是将磁盘定位到多个列上分别写入
行存储在数据修改也是占优的
c.
行存储通常将一行数据完全读出,如果只需要其中几列数据,就会存在冗余列
列存储每次读取的数据是集合中的一段或者全部。
由于列储存的数据是同质的,这种情况使数据解析变得容易。行存储则复杂的多,因为在一行记录中保存了多种类型的数据,数据解析需要在多种数据类型之间频繁转换,这个操作很消耗cpu
所以列存储的解析过程中更有利于分析大数据
d.
如果你大部分时间都是关注整张表的内容,而不是单独某几列,并且所关注的内容是不需要通过任何聚集运算的,那么推荐使用行式存储。
原因是重构每一行数据(即解压缩过程)对于HANA(高性能分析设备)来说,是一个不小的负担。
列式存储的话,比如你比较关注的都是某几列的内容,或者有频繁聚集需要的,通过聚集之后进行数据分析的表。行存储的写入是一次性完成,消耗的时间比列存储少,并且能够保证数据的完整性,缺点是数据读取过程中会产生冗余数据,如果只有少量数据,此影响可以忽略;数量大可能会影响到数据的处理效率。
列存储在写入效率、保证数据完整性上都不如行存储,它的优势是在读取过程,不会产生冗余数据,这对数据完整性要求不高的大数据处理领域,比如互联网,犹为重要。传统行式数据库的特性如下:
①数据是按行存储的。
②没有索引的查询使用大量I/O。比如一般的数据库表都会建立索引,通过索引加快查询效率。
③建立索引和物化视图需要花费大量的时间和资源。
④面对查询需求,数据库必须被大量膨胀才能满足需求。
列式数据库的特性如下:
①数据按列存储,即每一列单独存放。
②数据即索引。
③只访问查询涉及的列,可以大量降低系统I/O。
④每一列由一个线程来处理,即查询的并发处理性能高。
⑤数据类型一致,数据特征相似,可以高效压缩。比如有增量压缩、前缀压缩算法都是基于列存储的类型定制的,所以可以大幅度提高压缩比,有利于存储和网络输出数据带宽的消耗。
写入:
行存储的写入是一次完成,数据的完整性因此可以确定。
列存储需要把一行记录拆分成单列保存,写入次数明显比行存储多。
行存储在写入上占有很大的优势数据修改:
行存储是在指定位置写入一次,列存储是将磁盘定位到多个列上分别写入。
行存储在数据修改也是占优的数据读取:
行存储通常将一行数据完全读出,如果只需要其中几列数据,就会存在冗余列
列存储每次读取的数据是集合中的一段或者全部。
由于列储存的数据是同质的,这种情况使数据解析变得容易。行存储则复杂的多,因为在一行记录中保存了多种类型的数据,数据解析需要在多种数据类型之间频繁转换,这个操作很消耗cpu
所以列存储的解析过程中更有利于分析大数据
显而易见,两种存储格式都有各自的优缺点:行存储的写入是一次性完成,消耗的时间比列存储少,并且能够保证数据的完整性,缺点是数据读取过程中会产生冗余数据,如果只有少量数据,此影响可以忽略;数量大可能会影响到数据的处理效率。列存储在写入效率、保证数据完整性上都不如行存储,它的优势是在读取过程,不会产生冗余数据,这对数据完整性要求不高的大数据处理领域,比如互联网,犹为重要。
什么时候应该使用行式存储?什么时候应该使用列式存储呢?
如果你大部分时间都是关注整张表的内容,而不是单独某几列,并且所关注的内容是不需要通过任何聚集运算的,那么推荐使用行式存储。原因是重构每一行数据(即解压缩过程)对于HANA来说,是一个不小的负担。
列式存储的话,比如你比较关注的都是某几列的内容,或者有频繁聚集需要的,通过聚集之后进行数据分析的表。