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级别):


f0a4253f34814d1c97a4f65ee3fc9d1d.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的数据。


81f148fa8fc14e399e2c631e4297cac2.png

具体的实现逻辑如下:


42feaa67cf484cc0a4f20451c111a1a5.png


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

相关文章
|
4月前
|
自然语言处理 安全 搜索推荐
win11右键菜单怎么变回去?win11右键菜单如何改?Windows 10 如何清理右键菜单?
本文介绍了如何管理Windows系统右键菜单,包括清理多余选项、添加常用工具(如git-bash、Windows Terminal)及恢复默认设置。内容涵盖多种方法,适用于Win10与Win11系统,帮助用户个性化定制右键菜单,提升操作效率。
945 39
|
Linux Docker 容器
|
物联网
通过微信小程序体验阿里云IoT物联网平台
通过微信小程序体验阿里云IoT物联网平台
10053 0
|
Java Linux 开发工具
Linux下解压修改jar包并运行
Linux下解压修改jar包并运行
1466 0
|
11月前
|
SQL 分布式计算 Java
Spark SQL向量化执行引擎框架Gluten-Velox在AArch64使能和优化
本文摘自 Arm China的工程师顾煜祺关于“在 Arm 平台上使用 Native 算子库加速 Spark”的分享,主要内容包括以下四个部分: 1.技术背景 2.算子库构成 3.算子操作优化 4.未来工作
1462 0
|
10月前
|
机器学习/深度学习 计算机视觉
RT-DETR改进策略【注意力机制篇】| ICLR2023 高效计算与全局局部信息融合的 Sea_Attention 模块(含HGBlock二次创新)
RT-DETR改进策略【注意力机制篇】| ICLR2023 高效计算与全局局部信息融合的 Sea_Attention 模块(含HGBlock二次创新)
290 2
RT-DETR改进策略【注意力机制篇】| ICLR2023 高效计算与全局局部信息融合的 Sea_Attention 模块(含HGBlock二次创新)
|
SQL 监控 数据可视化
DolphinScheduler教程(02)- 系统架构设计(上)
DolphinScheduler教程(02)- 系统架构设计(上)
535 0
DolphinScheduler教程(02)- 系统架构设计(上)
|
SQL 自然语言处理 数据库
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
|
cobar 关系型数据库 MySQL
使用MyCat实现MySQL主从读写分离(一)概述
【8月更文挑战第11天】MySQL读写分离通过主从复制分散负载,主库负责写操作,从库承担读查询,以复制技术确保数据一致性。此策略有效缓解锁竞争,提升查询效能并增强系统可用性。实现方式包括应用层处理,简便快捷但灵活性受限;或采用中间件如MyCAT、Vitess等,支持复杂场景但需专业团队维护。
403 0
|
SQL 关系型数据库 API
Star 4.7k!高效SQL Parser!纯Python开发!自称目前最快的纯Python SQL解析器!
Star 4.7k!高效SQL Parser!纯Python开发!自称目前最快的纯Python SQL解析器!
604 1

热门文章

最新文章