压缩包含许多重复项的 csv 文件的最佳方法是什么?

what is the best way to compress a csv file with many duplicates?

我正在处理如下一些数据,第一列是交易 ID,第二列是模拟 ID(重复很多),第三列是一些愚蠢的日期也很重复,第四列一个是交易的现值,大多数情况下它只是 0,但任何其他值都应该是非常独特的。

我的问题是,有什么方法可以将数据压缩到当前大小的20%存储,同时支持查找功能?

我试过Avro项目作为一种方式,它可以节省40%的存储空间并支持apache drill query,但我的老板希望能节省80%。

41120634|1554|20150203|-509057.56
40998001|1554|20150203|0
40960705|1554|20150203|0
40998049|1554|20150203|0
41038826|1554|20150203|0
41081136|1554|20150203|-7198152.23
41120653|1554|20150203|-319.436349
41081091|1554|20150203|-4.28520907E+009
41120634|1536|20150227|-528555.02
41038808|1536|20150227|0
40998001|1536|20150227|0
41120634|1556|20150130|-528822.733
40960705|1536|20150227|0
40998049|1536|20150227|0
41038826|1536|20150227|0

Apache Drill 支持 Parquet 文件格式。 Parquet 是一种基于列的文件格式,支持列压缩。这允许 Parquet 利用列中的重复值来节省 space。相比之下,Avro 是一种基于行的文件格式,因此对于列中的重复值,它无法实现与 Parquet 一样多的压缩。 These guys have reported 87% compression of their csv data using parquet. More information about how to use Parquet with apache drill is here.

此外,Drill 团队正在努力改进 Parquet,这可能会进入 1.13 版本。我相信通过新的改进,Parquet 文件的读取性能提高了 4 倍。