Spark-读Parquet-对于EqualsTo,StartsWith和Contains的谓词下推

使用Spark SQL的array_contains作为JOIN操作的条件进行优化 使用Spark SQL的array_contains作为JOIN操作的条件进行优化在Spark中,Spark SQL是一种用于处理结构化数据的模块,它提供了一种基于SQL的查询语言。Spark SQL提供了丰富的函数库,以便在处理数据时进行转换和操作。其中,array_contains函数是一个非常有用的函数,用于检查数组中是否包含指定的元素。在某些情况下,我们可以使用array_contains函数作为JOIN操作的条件,以优化查询性能。 阅读详情

Parquet文件对于每一个Row group的每一行都包含了MIN/MAX的统计,这能够让Spark跳过不必要的数据块,以下看看这是怎么回事。
在我们测试中我使用了4个row group以及在product列有以下MIN/MAX统计信息:

我们基于此文件建立了events表,运行以下sql:

SELECT name, location FROM events WHERE product = 'Orange';

根据每个row group的最大最小值统计信息,spark只读取row group2(MIN: Grape, MAX: Pineapple)和row group 3(MIN: Lemon, MAX: Peach)并且试着去找满足product=‘orange’条件的数据。
spark并没有读取row group1 和row group4,是因为orange已经超过了最大最小值的范围。
如果你看这个查询的EXPLAIN EXTENDED输出,你可以看到PushedFilters EqualTo:

== Physical Plan ==
*(1) Project [product#22]
+- *(1) Filter (isnotnull(product#22) && (product#22 = Orange))
   +- *(1) FileScan parquet events...
           PushedFilters: [IsNotNull(product), EqualTo(product,Orange)]

LIKE ‘%value%’

让我看看product LIKE ‘%Orange%’ 条件

SELECT name, location FROM events WHERE product LIKE '%Orange%';

物理计划如下:

== Physical Plan ==
*(1) Project [product#22]
+- *(1) Filter (isnotnull(product#22) && (product#22 = Orange))
   +- *(1) FileScan parquet events...
           PushedFilters: [IsNotNull(product), StringContains(product,Orange)]

虽然spark 试着去下推StringContains过滤条件,但是spark还是必须得读取所有row group,因为MIN/MAX统计信息并不能推断是否满足该条件。
你也可以看到执行完该sql后,Input Size 和Records 的统计信息指标。

LIKE ‘value%’

让我们看看product like ‘orange%’条件。
物理计划如下:

== Physical Plan ==
*(1) Project [product#22]
+- *(1) Filter (isnotnull(product#22) && (product#22 = Orange))
   +- *(1) FileScan parquet events...
           PushedFilters: [IsNotNull(product), StringStartsWith(product,Orange)]

和product LIKE '%Orange%'条件不一样,product LIKE ‘Orange%’ 可以让spark 利用MIN/MAX统计信息,并且跳过row group1 和row group4。

你也可以执铜鼓行完该sql后,Input Size 和Records 的统计信息指标来进行校验。

本文翻译自Spark – Reading Parquet – Predicate Pushdown for LIKE Operator – EqualTo, StartsWith and Contains Pushed Filters

电流模架构Bandgap设计与仿真 带隙基准作为集成电路中一个重要模块,被广泛应用在低压差线性稳压(LDO)、充电电池保护芯片和通信电路、射频收发器、flash存储器等多种模拟及数模混合集成电路中,并且是片上集成系统(SOC)芯片中不可或缺的部分,为整个芯片提供精确的电压参考点............ 阅读详情

相关推荐

agv调度系统3.0技术介绍

agv调度系统,穿梭车调度系统,调度系统技术介绍,教你做调度

持续分享调度系统开发过程 4868

SparkSql数组操作的N种骚气用法

总结一下sparksql(基于branch3.3) 中 array操作相关的骚气用法,这恐怕是总结的最全的一篇了,哈哈~~

xiaoluobutou的专栏 3920

Unity3D 2022版如何一键安装Newtonsoft.Json?最新Package Manager教程

本文详细介绍了在Unity3D 2022及以上版本中,如何通过Package Manager一键安装和配置Newtonsoft.Json(Json.NET)。教程涵盖了从打开Package Manager、搜索并安装正确包源,到验证安装和基础使用的完整流程,旨在帮助开发者以现代化、可靠的方式集成这一强大的JSON处理框架,提升开发效率并规避手动导入的常见问题。

lg888的博客 920

spark基础知识

目录1. RDD1.1 RDD的创建1.2 持久化1.3 分区1.4 RDD相关的操作1.4.1 转换操作1.4.2 行动操作1.4.3 PairRDD(键值对) 1. RDD 本质:一个RDD就是一个分布式对象集合,本质上是一个只读的分区记录集合,每个RDD可分成多个分区,每个分区就是一个数据集片段。 // 创建一个spark config val sparkConf = new SparkConf().setMaster(config("spark.cores")).setAppName("zh

qq_43283527的博客 1501

从手机到自动驾驶:MIPI-CSI2协议演进史与车规级改造要点

本文追溯了MIPI-CSI2协议从智能手机摄像头到自动驾驶核心传感器的演进历程。重点剖析了该协议在车规级改造中面临的严苛挑战,包括物理层稳定性、EMC防护、功能安全与数据可靠性等关键要点,并探讨了其在多传感器融合与高带宽实时传输中的工程实践。

weixin_28318011的博客 306

Oracle EBS报表开发入门:Report Builder安装避坑指南(Win10/11兼容版)

本文详细介绍了在Windows 10/11系统上成功安装和配置Oracle Report Builder的完整避坑指南。通过修改系统兼容性、解决虚拟内存报错、正确设置NLS_LANG和TNS连接等关键步骤,确保开发环境稳定运行。同时,阐述了Report Builder与BI Publisher在现代Oracle EBS报表开发中的协作定位与工作流,帮助开发者高效搭建报表开发环境。

d6e7f8的博客 754

Spark-读取Parquet-为什么task数量会多于Row Group的数量

翻译这篇文章的目的是为了让读者们更好的理解spark读取parquet的原理 一个row group 是读取parquet的不可分的最小单元,并且你会以为由spark创建的task数量不会多于在parquet数据源中的row groups的数量 但是spark却可以创建出多余row groups个数的task,让我们看看怎么回事 任务计划 一般来说,为了知道有多少个task数量,我们就必须去每一个parquet文件的footer以便于知道row groups的个数,但是这种操作是比较昂贵的,尤其是在云存

monkeyboy_tech的博客 2070

15-YOLOV8OBB损失函数详解

在Ultralytics YOLO 模型中,OBB 由YOLO OBB 格式中的四个角点表示。这样可以更准确地检测到物体,因为边界框可以旋转以更好地适应物体。其坐标在 0 和 1 之间归一化:YOLO 在内部处理损失和输出是xywhr 格式,xy表示边界框的中心点、whr表示宽度、高度和旋转角度。

zqb_123的博客 797

Spark SQL 数组函数合集:array_agg、array_contains、array_sort…详解

spark 数组函数合集

喻师傅的学习笔记 2739

24. 在QML界面中嵌入QWidget窗口

目前QT官方主推的界面开发方式是采用QML进行界面设计,但在QML未流行之前,很多的项目都是采用QWidget开发的,把之前的代码全部转换为QML代码显然工作量非常大,如果能将QWidget窗口嵌入到QML界面中,那么开发效率将提高很多,且QML无法实现的功能也能借助于QWidget框架进行实现。

山间点烟雨 5921

YOLOv9 损失函数解析

YOLOv9作为YOLO系列的最新成员,在损失函数设计上进行了多项创新,重点优化了动态任务对齐机制、多模态定位损失融合以及跨层级梯度协同,进一步提升了检测精度与训练效率。

浩瀚之水的专栏 1293

Spark SQL filter not contains

软件环境:CDH5.8.0;问题:在使用Spark SQL 读取Hive进行操作的时候,需要使用不包含,如下:(在Spark SQL中有contains,like,rlike函数)在Hive中有表id_url ,内容如下:+------------+-----------------------------------+--+ | id_url.id | id_url.ur

fansy1990的专栏 1万+

37、免驱动USB双目同步测距3D活体深度检测和RV1126结合V4L开发USB摄像头使用

基本思想:需要使用双目摄像头在rv1126上进行活体检测,然后将画面实时返回到桌面上,记录一下。第二步:刷机rv1126开发板系统和ssh远程连接,见参考目录。第一步:购买可见光的红外摄像头,见参考连接,在PC端测试可用。

sxj731533730 2620

springboot启动banner

application-version:${application.version} springboot-version:${spring-boot.version...

qq_22594791的博客 509

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

SparkSQL下Parquet中PushDown的实现

Hive中也有PushDown。PushDown可以极大减少数据输入,极大的提高处理效率。SparkSQL实现了PushDown,在Parquet文件中实现PushDown具有很重要的意义。PushDown是一种SQL优化方式,通常用在查询。应用场景:假设通过DataFrame,df.select(a,b,c).filter(by a).filter(by b).select(c).filter(b

囧芝麻的博客 1952

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

spark 启动流程 源码解析

简单例子 object sum { def main(args: Array[String]): Unit = { val conf =new SparkConf().setAppName("SUM"); conf.setMaster("local[3]") val size=1024*1024*1024; val sc=new SparkContext(c...

stuliper的专栏 1620

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Spark运行流程源码走读

SparkContext是整个spark程序的入口,在写WordCount程序时会new SparkContext(sparkConf)构建一个SparkContext实例。在SparkContext.scala中会执行一些必要的任务,最重要的如下(在396行的try块中的521行):  // Create and start the scheduler val (sched, ts) = Sp

ZERO 1608

跟我一起学【Spark】之——rdd.filter(_.contains("1")).count()详解

形如:rdd.filter(_.contains("1")).count() _.contains("1") //目的是获取包含“1”的行 rdd.filter(_.contains("1")).count()// 计算rdd中包含“1” 的行的总数 例如:rdd 行编号 数据 1 1 2 21 rdd.filter(_.contains("1")).co...

SunWuKong_Hadoop的博客 2392

【极简spark教程】spark常用内置函数

三分钟看懂spark内置函数,三行代码写出自己的UDF

檐前潜心学种瓜 4527

spark入门笔记scala版

基本使用 打开python版本的spark shell方式:bin/pyspark 打开scala版本的spark shell方式:bin/spark-shell conf/log4j.properties log4j.rootCategory=INFO,console 改为WARN,console,降低日志级别,减少无用日志输出 lines=sc.textFile("a.txt"...

wang2008start的专栏 495

Spark笔记

spark程序的工作流程 从外部数据创建出输入RDD 使用诸如filter()这样的转化操作对RDD进行转化,已定义新的RDD 告诉Spark对需要被重用的中间结果RDD执行peisist()操作 使用行动操作(例如count()和first()等)来触发一次并行操作,Spark会对计算进行优化后再执行 向spark传递函数传递的函数及其引用的数据需要时可序列化的(实现了java的Serializ

1006346386@qq.com 501

spark部分算子,自己的理解

contains 判断是否在集合中存在 copyToArray(有长度的数组,开始位置,数组个数) x.count(_>0) 也可以x.count(_%2==0)也可以x.count(x=>true) x.diff(y) 差集 x.intersect(y) 交集 x.union(y) 并集 x.distinct 集合去重 x.drop(3) 从左向右删3个元素 println(x.endWith(3,5))//false 判断是否以3,5结尾 exists(函数) 是否存在 fil...

RUA_lalalla的博客 244

spark常用方法

与合并不同,连接会对键相同的值进行合并,连接方式多种多样,包含内连接、右外连接、左外连接、全外连接,不同的连接方式需要使用不同的连接方法。用户可以使用contains()方法判断列表中是否包含某个元素,若列表中存在指定的元素则返回true,否则返回false。数组是Scala中常用的一种数据结构,数组是一种存储了相同类型元素的固定大小的顺序集合。将有键的一组数据与另一组有键的数据根据键进行连接,是对键值对数据常用的操作之一。Init:查看除最后一个元素外的所有元素。tail:查看第一个元素之后的其余元素。

2301_81071890的博客 1230

java+spark的基本集成查询

原文地址:https://blog.youkuaiyun.com/sparkexpert/article/details/51042970除了文章中拥有的集成查询,我还发现有几个需要使用:1.equalTo : a.equalTo(b) 匹配结果,例如:type.equalTo("2")2.fill : .na().fill(0) ,将所有为空结果null换成03.sortBy : 排序,例如:sortBy(...

fearlessnesszhang的博客 1311

【spark】第二章——SparkCore之运行架构及核心编程

Spark 框架的核心是一个计算引擎,整体来说,它采用了标准 master-slave 的结构。如下图所示,它展示了一个 Spark 执行时的基本结构。图形中的 Driver 表示 master,负责管理整个集群中的作业任务调度。图形中的 Executor 则是 slave,负责实际执行任务。 由上图可以看出,对于 Spark 框架有两个核心组件:Spark 驱动器节点,用于执行 Spark 任务中的 main 方法,负责实际代码的执行工作。 Driver 在 Spark 作业执行时主要负责: ➢ 将用户程

无邪的博客 719

Spark SQL Start(2.4.3)

原文地址: https://spark.apache.org/docs/latest/sql-programming-guide.html OverView Spark SQL是用于处理结构化数据的spark模块。与基本的Spark RDD API不同,Spark SQL提供的接口为Spark提供了更多的数据结构和计算信息。在内部,Spark SQL使用这些额外的信息来执行额外的优化。有几种方法可...

奋斗 788
上一篇: Parquet文件是怎么被写入的-Row Groups,Pages,需要的内存,以及flush操作
下一篇: Spark DPP(动态分区裁剪)导致的DataSourceScanExec NullPointerException问题分析以及解决
鸿乃江边鸟
博客等级 码龄6年 3746粉丝 235原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值