SPARK Parquet嵌套类型的向量化支持以及列索引(column index)

简介: SPARK Parquet嵌套类型的向量化支持以及列索引(column index)

背景

本文基于Spark 3.3.0

列式存储Parquet文件越来越受到工业界的青睐,在delta以及Spark中应用广泛,具体的项目见:parquet-mr


分析

Parquet格式

关于parquet的格式存储以及读取,可以参考大数据列存标准格式 - Parquet,总结一下就是:

Parquet采用类似Protobuf的协议来描述数据的Schema,字段的描述有三种(逻辑上):

required  有且仅有一次
optional 0或1次
repeated 0次或多次


具体到物理存储,就得有Repetition Level(对应repeated),Definition Level(对应optional) ,required是不需要的,因为字段存在就有,不存在就没有。

其实这种很好理解,因为在Dremel/Parquet中,提出的是以树状形式来组织schema中的字段,举例子:

message AddressBook {
  required string owner;
  repeated string phoneNumber;
  repeated group contacts {
    required string name;
    optional string phoneNumber;
  }
}

对应到树形结构为:

              AddressBook
          /           |               \  
         V            V                V
       owner      phoneNumber    contacts
                                    /    \
                                   V      V
                                 name    phoneNumber 


这样用Repetition Level 和Definition Level来表示数据位于哪一层级就能精确定位一个数据。


Parquet嵌套类型向量化


根据以上的Parquet的格式存储,在读取的Parquet文件的时候,对于非向量化的读取,是一行一行的读取,支持所有类型,对于向量化的读取在Spark 3.3.0以前是不支持嵌套类型(如 struct map list)的。

具体行读取如下(具体到page级别):

image.png


向量化的读取如下:

47c25e6fbcf742a99d80c1f3f4639102.png


可以看到是按照批次读取的。

注意:按照schema的定义,有些数据有可能是不存在的,所以对于同一列对应的Repetition Level 和Definition Level也有可能是不一样的。

性能也是有很大的提升:

77eec39f50b4409c8cc92688ee7f3779.png


Parquet的列索引


在Parquet 1.11.0之前,Parquet是不支持列索引的,具体见PARQUET-1201。

在Spark 3.2.0 便支持了paruqet的列索引的读取,具体见:SPARK-26345

在spark 3.2.0 之前Parquet的谓词下推是基于Row group的统计信息来的,如:最大最小值,字典信息,以及Parquet-1.12的Bloom filter,

在Spark 3.2.0 之后,我们可以基于page级别的数据过滤(只选择需要的page),这样能大大减少IO,因为在page级别过滤的话,不需要每次都会获取整个Row group的数据。


image.png



具体的实现逻辑如下:

image.png


之前的读取是把对应Row group的数据全部读取过来,之后再进行过滤。

相关文章
|
存储 SQL JSON
Spark - 一文搞懂 parquet
parquet 文件常见于 Spark、Hive、Streamin、MapReduce 等大数据场景,通过列式存储和元数据存储的方式实现了高效的数据存储与检索,下面主要讲parquet 文件在 spark 场景下的存储,读取与使用中可能遇到的坑。......
2194 0
Spark - 一文搞懂 parquet
|
3月前
|
机器学习/深度学习 分布式计算 大数据
Spark 适合解决多种类型的大数据处理问题
【9月更文挑战第1天】Spark 适合解决多种类型的大数据处理问题
67 3
|
4月前
|
分布式计算 资源调度 Hadoop
Spark 中的集群管理器类型详解
【8月更文挑战第14天】
83 4
|
7月前
|
机器学习/深度学习 数据采集 分布式计算
【机器学习】Spark ML 对数据进行规范化预处理 StandardScaler 与向量拆分
标准化Scaler是数据预处理技术,用于将特征值映射到均值0、方差1的标准正态分布,以消除不同尺度特征的影响,提升模型稳定性和精度。Spark ML中的StandardScaler实现此功能,通过`.setInputCol`、`.setOutputCol`等方法配置并应用到DataFrame数据。示例展示了如何在Spark中使用StandardScaler进行数据规范化,包括创建SparkSession,构建DataFrame,使用VectorAssembler和StandardScaler,以及将向量拆分为列。规范化有助于降低特征重要性,提高模型训练速度和计算效率。
131 6
|
SQL 分布式计算 HIVE
spark sql编程之实现合并Parquet格式的DataFrame的schema
spark sql编程之实现合并Parquet格式的DataFrame的schema
349 0
spark sql编程之实现合并Parquet格式的DataFrame的schema
|
存储 SQL 分布式计算
【Parquet】Spark读取Parquet问题详解……
【Parquet】Spark读取Parquet问题详解……
862 0
【Parquet】Spark读取Parquet问题详解……
|
人工智能 分布式计算 Cloud Native
向量化执行引擎框架 Gluten 宣布正式开源,并亮相 Spark 技术峰会
向量化执行引擎框架 Gluten 宣布正式开源,并亮相 Spark 技术峰会
880 0
向量化执行引擎框架 Gluten 宣布正式开源,并亮相 Spark 技术峰会
|
分布式计算 Hadoop Linux
云计算集群搭建记录[Hadoop|Zookeeper|Hbase|Spark | Docker]更新索引 |动态更新
为了能够更好的查看所更新的文章,讲该博文设为索引 小约定 为了解决在编辑文件等操作的过程中的权限问题,博主一律默认采用root账户登录 对于初次安装的用户可以采用如下命令行:
141 0
云计算集群搭建记录[Hadoop|Zookeeper|Hbase|Spark | Docker]更新索引 |动态更新
|
存储 分布式计算 编译器
SPARK的计算向量化-spark本身的向量化
SPARK的计算向量化-spark本身的向量化
520 0
|
28天前
|
分布式计算 大数据 Apache
ClickHouse与大数据生态集成:Spark & Flink 实战
【10月更文挑战第26天】在当今这个数据爆炸的时代,能够高效地处理和分析海量数据成为了企业和组织提升竞争力的关键。作为一款高性能的列式数据库系统,ClickHouse 在大数据分析领域展现出了卓越的能力。然而,为了充分利用ClickHouse的优势,将其与现有的大数据处理框架(如Apache Spark和Apache Flink)进行集成变得尤为重要。本文将从我个人的角度出发,探讨如何通过这些技术的结合,实现对大规模数据的实时处理和分析。
83 2
ClickHouse与大数据生态集成:Spark & Flink 实战

热门文章

最新文章

相关实验场景

更多