随着大数据 Hadoop/Spark 生态的不断发展和成熟,TextFile、CSV这些文本格式存储效率低,查询速度慢,往往不能很好地满足大数据系统中存储和查询的需求,列式存储也在大数据社区逐渐兴起到成熟。目前,使用比较广泛的列式存储主要是 Apache Parquet 和 Apache ORC,Parquet 由谷歌的 Dremel 发展而来,由Twitter 贡献给社区,ORC 则是由 Hive 的 RC File 发展而来,从Hive项目中独立出来,二者目前都是比较活跃的列式存储项目。
传统的数据编码方式是以行为单位进行,列式存储则是将数据划分成数据块,每个数据块内部按列的方式进行编码存储,通过使用列式存储会有以下好处:
列式存储在存储数据时,为了提高压缩效率,会进行一些编码操作,如图所示。
Run-length encoding(RLE)
Dictionary
Bitpacking
Zigzag for signed
分别使用相同的 TPC 数据集进行测试,从压缩效率上讲,数据库大小越小,压缩效率越好。这里 ORC 使用 Zlib 压缩, Parquet 使用 Gzip 压缩。
TPC-DS(Decimal Version): https://github.com/cloudera/impala-tpcds-kit
TPC-DS(Double Version): https://github.com/hortonworks/hive-testbench
TPCx-BB: http://www.tpc.org/tpcx-bb/
Parquet 和 ORC Encoding的实现细节对比
Parquet 的 Integer的是通过字典的编码方式存储的,为了防止字典过大,超过字典上限后,则通过其他方式存储。
PARQUET_V1 和 PARQUET_V2 是 Parquet 内部使用的版本,可以通过相应的参数进行选择。
3 Parquet 的 DeltaBinaryPacking
Parquet 的 DeltaBinaryPacking 的实现参考了以下博客,具体的格式如图。
http://lemire.me/blog/archives/2012/09/12/fast-integer-compression-decoding-billions-of-integers-per-second/
原始值:6,6,6,6,6,6,13,17
编码后:3,0,6,-2,13,17
HIVE在 0.12之后做了比较好的优化,可以覆盖常见的四种场景,效果也会比较好
SHORT_REPEAT : Short repeated integer sequences.
DELTA : Monotonically increasing or decreasing sequences, sequences with fixed delta values or long
1 sequences.
DIRECT : Random integer sequences whose number of bit requirement doesn't vary a lot
PATCHED_BASE : Random integer sequences whose number of bit requirement varies beyond a
threshold.
点击下方图片即可阅读
决策树算法原理(上)
决策树算法原理(下)
如果你也有想分享的干货,可以登录天池实验室(notebook),包括赛题的理解、数据分析及可视化、算法模型的分析以及一些核心的思路等内容。
小天会根据你分享内容的数量以及程度,给予丰富的神秘天池大礼以及粮票奖励。分享成功后你也可以通过下方钉钉群👇主动联系我们的社区运营同学(钉钉号: yiwen1991)
天池宝贝们有任何问题,可在戳“留言”评论或加入钉钉群留言,小天会认真倾听每一个你的建议!