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

AvroParquetWriter

https://blog.51cto.com/u_16213415/9361292

https://blog.csdn.net/yangzhaohui168/article/details/88583489

https://developer.aliyun.com/ask/61439

 

posted on 2025-07-21 00:11  silyvin  阅读(5)  评论(0)    收藏  举报