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

【ArcGIS微课1000例】0066:图像融合(全色+多光谱)操作案例教程 图像融合是指将不同类型传感器的影像进行融合,既能使图向具有较高的空间分辨率,又具有多光谱的特性。除了遥感软件如Erdas能进行图像融合,ArcGIS软件也可以进行图像融合等图像增强操作。 阅读详情

相关推荐

死磕GMSSL通信-java/Netty系列(二)

Netty-tcnative再linux编译比较好编译,但是再window编译,我尝试了各种办法,总是编译失败,所以我采用半自动的方式进行编译,Netty-tcnative会生成临时文件,直接用vs打开,设置openssl的头文件和静态库路径,然后生成静态库,静态库改个名字放到jar包里边,其实自动编译也是这个原理哈哈O(∩_∩)O。直接传输五个证书的路径吗,之前有的是说要转成x509之类的,转来转去的有点麻烦,这个是直接传输证书路径,由底层gmssl去解析,格式必须是pem格式。然而,若项目已依赖于。

qq_36577699的博客 3024

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

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

xiaoluobutou的专栏 3920

Selenium实战:突破反爬,自动化抓取国家知识产权局专利数据

网络爬虫是数据采集的核心技术,其原理是通过程序模拟浏览器行为,自动访问网页并提取结构化信息。在数据驱动决策的今天,高效获取公开数据对市场分析、技术调研和竞争情报至关重要。然而,面对广泛应用的JavaScript动态渲染和反爬虫机制,传统的静态页面抓取方法往往失效。Selenium作为浏览器自动化工具,通过驱动真实浏览器执行JavaScript,能够有效绕过前端反爬,实现“可见即可得”的数据抓取,在需要与页面进行复杂交互或处理动态内容的场景中价值显著。本文以【专利数据】抓取为例,结合【Selenium】工具,

weixin_33881140的博客 392

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

BFD+OSPF+FRR:构建高可用网络的核心铁三角

摘要:VRRP、OSPF、BFD和FRR协同实现网络高可用。VRRP负责网关冗余,OSPF确保路由可达,BFD提供毫秒级故障检测,FRR实现快速路径切换。故障时,BFD立即检测并通知OSPF,FRR在OSPF收敛前切换流量,VRRP完成网关切换(如需)。BFD采用异步模式动态建立,效率最高。该机制确保业务流量无缝切换,提升网络可靠性。

A516988的博客 753

SORT算法在遮挡下总跟丢?深入OC-SORT源码,拆解其三大创新点如何解决卡尔曼滤波的顽疾

本文深入解析OC-SORT算法如何通过三大创新点解决多目标跟踪中的卡尔曼滤波顽疾。OC-SORT引入在线平滑虚拟轨迹技术(OOS)、观测中心动量匹配机制(OCM)和基于最后观测的轨迹恢复(OCR),显著提升了遮挡场景下的跟踪性能。实验数据显示,相比传统SORT算法,OC-SORT在MOT17数据集上MOTA提升5.7%,遮挡恢复成功率提高64.2%,为Multi-Object Tracking领域带来突破性进展。

weixin_42547431的博客 238

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

用Python玩转农业大数据:从Landsat遥感影像到作物产量预测实战教程

本文详细介绍了如何利用Python处理Landsat遥感影像数据,并结合土壤信息构建作物产量预测模型。从环境搭建、数据预处理到模型训练与可视化,提供了一套完整的农业大数据分析实战方案,帮助读者掌握遥感影像处理和机器学习在精准农业中的应用。

weixin_30832143的博客 397

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

spark 数组函数合集

喻师傅的学习笔记 2739

vrep和matlab,使用Matlab与V-REP联合仿真 - Play V-REP with Matlab

OS: Win10 x64Matlab: R2016bV-REP: V-REP PRO EDU v3.5.0 下载、安装与支持V-REP操作基础V-REP仿真基础Matlab环境准备一个简单的例子对V-REP有一定了解的读者可以直接跳到第三节Matlab环境准备。下载、安装与支持V-REP提供Windows、Linux和MacOS三个平台的应用程序支持,任意平台都提供教育版和专业版两个版本。教育版...

weixin_42660494的博客 3211

华为OD机试新系统真题【终端设备档位差异统计】

华为OD机试 新系统真题【终端设备档位差异统计】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【终端设备档位差异统计】多语言题解。

qq_45776114的博客 781

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万+

【OpenClaw从入门到精通】第10篇:OpenClaw生产环境部署全攻略:性能优化+安全加固+监控运维(2026实测版)

本文聚焦OpenClaw从测试环境走向生产环境的核心痛点,围绕“性能优化、安全加固、监控运维”三大维度展开实操讲解。先明确生产环境硬件/系统选型标准,再通过硬件层资源管控、模型调度策略、缓存优化等手段提升响应速度(实测响应效率提升50%+);接着从网络、权限、数据三层构建安全防护体系,集成火山引擎安全方案拦截高危操作;最后落地TenacitOS可视化监控与Prometheus告警体系,配套完整故障排查清单和虚拟实战案例。全文所有配置、代码均经实测验证,兼顾新手入门实操性和进阶读者的生产级部署需求。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 3403

springboot启动banner

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

qq_22594791的博客 509

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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笔记

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

1006346386@qq.com 501

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部分算子,自己的理解

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、付费专栏及课程。

余额充值