parquet【yetdone】
典型场景:Spark SQL、Presto 等 OLAP 引擎的首选格式,适合海量数据的交互式分析。
Block (hdfs block): 指 hdfs 文件系统的 block,parquet 是在 hdfs 文件之上的数据组织格式;(当然现在很多对象存储系统,比如 S3,也支持 parquet 存储格式);
行存储中数据写入的成本较低,适合数据有频繁更新的场景;
通过使用索引,能大幅提高行存储的数据查询速度;
行存储是传统的数据组织形式,更适合传统的 OLTP 系统;
由于连续存储在一起的列的数据类型都一样,所以数据压缩率更高
列存储中数据查询的成本较低,特别适合分析时只查询部分列的场景,因为不需要扫描/读取不需要查询的列;
列存储由于数据更新成本较高,一般适合读多写少的场景;(但是不代表不能更新!)
列存储是新型数据组织形式,更适合 OLAP 分析型系统;
https://www.jb51.net/program/2966929kd.htm
聪明的朋友肯定很快就发现了,因为原始结构里有个数组,长度是不定的,如果只是把数据按顺序存放,那就无法区分record之间的边界,也就不知道每个值究竟属于哪条record了。所以简单地打平是不可行的。
为了解决这个问题,Parquet的设计者引入了两个新的概念:repetition level和definition level。这两个值会保存额外的信息,可以用来重构出数据原本的结构。
关于repetition level和definition level具体是如何工作的,我会放到最后来讲。这里只需要记住,Parquet文件对每个value,都同时保存了它们的repetition level和definition level,以便确定这个value属于哪条record。
数据集往往包含上亿条record,所以我们会进行一次水平切分,把这些record切成多个“分片”,每个分片被称为Row Group。为什么要进行水平切分?虽然Parquet的官方文档没有解释,但我认为主要和HDFS有关。因为HDFS存储数据的单位是Block,默认为128m。如果不对数据进行水平切分,只要数据量足够大(超过128m),一条record的数据就会跨越多个Block,会增加很多IO开销。
https://www.modb.pro/db/456453
-
Parquet格式:
-
数据模型: Avro, Thrift, Protocol Buffers, POJOs
-
查询引擎: Hive, Impala, Pig, Presto, Drill, Tajo, HAWQ, IBM Big SQL
-
计算框架: MapReduce, Spark, Cascading, Crunch, Scalding, Kite
-
Parquet是一种列式的二进制文件格式,Impala基于Parquet文件可以高效的处理大型复杂查询
默认情况下,Impala的INSERT...SELECT语句创建的Parquet文件的块大小是256MB
-
在一个由100个节点组成的16核机器中,可以同时处理数千个数据文件
-
如在“许多小文件”和“单个大文件”之间找到一个高I/O和并行处理能力的平衡点,就可以在执行INSERT...SELECT语句之前设置PARQUET_FILE_SIZE,以控制每个生成的Parquet文件的大小
https://blog.csdn.net/m0_37739193/article/details/136300647
https://blog.51cto.com/u_16213415/9361292
https://blog.csdn.net/yangzhaohui168/article/details/88583489
https://developer.aliyun.com/ask/61439
浙公网安备 33010602011771号