spark学习记录之join引发重复计算

一直对spark sql中的join操作感到迷惑,

如果join之前的操作没有进行persist DataFrame的话,是否会存在让之前的transformation重复执行的问题,以及重复多少次。

看一个例子

spark学习记录之join引发重复计算

考虑在map1/map2处设置一个累加器,join之后,看看map1/map2到底执行了多少次。

上代码

df1 = spark.createDataFrame([[i, i+100] for i in range(7)]).toDF("a", 'v').repartition(13)

accumulator1 = sc.accumulator(0)
accumulator2 = sc.accumulator(0)

@udf
def map1(x):
    accumulator1.add(1)
    return x

@udf
def map2(x):
    accumulator2.add(1)
    return x

@udf
def map3(x):
    return x

df2 = df1.select(map1("a").alias("b"))

df3 = df2.select(map2("b").alias("c"))
df4 = df2.select(map3("b").alias("d"))
df5 = df3.join(df4, on=df3.c==df4.d, how='inner')

df5.collect()
print(accumulator1.value)
print(accumulator2.value)

为了方便,元素个数和分区数选了两个质数,分别为7和13.

程序运行结果为28和14.

acc1是acc2的两倍,看起来比较合理。

join得到的df5包含c和d两列。d列对acc2没有贡献。acc2的计数一半来自df3中的c列,另一半来自join中用到的df3.c==df4.d条件。所以7个元素用了两次得到14。对应地,acc1结果为28。

这样会用到2次df3,4次df2。重复计算消耗资源比较大的话建议persist相关df。

PySpark和Spark的运算机制也略有不同。

Spark的DataFrame中也提供了join的默认参数,如果把代码改为 df5 = df3.join(df4),两个累加器的输出分别是182和91.

通常执行完默认join之后会连一个where或者filter来进行进一步过滤,但这样可能会引入一定的重复计算,所以我这不太推荐这么使用。

在Spark中,

import org.apache.spark.sql.functions.udf

case class A(a: Int, v: Int)

val df1 = Seq(A(0, 100), A(1, 101), A(2, 102), A(3, 103), A(4, 104), A(5, 105), A(6, 106)).toDS().repartition(13)

val accumulator1 = sc.longAccumulator("0")
val accumulator2 = sc.longAccumulator("0")

val map1 = udf((x: Int) => {
  accumulator1.add(1)
  x
})
val map2 = udf((x: Int) => {
  accumulator2.add(1)
  x
})
val map3 = udf((x: Int) => x)

val df2 = df1.select(map1(col("a")).alias("b"))
val df3 = df2.select(map2(col("b")).alias("c"))
val df4 = df2.select(map3(col("b")).alias("d"))
val df5 = df3.join(df4)

df5.collect()

println(accumulator1.value)
println(accumulator2.value)

输出结果就是正常的,为14和7

两种语言join后的partition个数也不一致。

应该是有优化机制的,这部分就先不深究了。。

Original: https://www.cnblogs.com/antelx/p/16700995.html
Author: Antel
Title: spark学习记录之join引发重复计算

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/643693/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 巴西针对电源产品的新法规

    巴西ANATEL近日发布了一项新的5159法案,该法案内容主要是关于移动电话使用的有线和无线电源和充电器。 法案称为《手机用充电器合格评定技术要求及测试程序》,涵盖了产品安全性和E…

    技术杂谈 2023年6月21日
    085
  • 改Bug的经验

    如果修复某个Bug花了很长时间,这时候就要问问自己为什么,怎么做才吸取经验教训,在类似的问题上不再出问题,以及采用的方法,使用的工具是否还有改进的地方;当所有问题都解决之后,一定要…

    技术杂谈 2023年7月25日
    083
  • 经典45个git使用技巧与场合,专治不会合代码。

    前言 git对于大家应该都不太陌生,熟练使用git已经成为程序员的一项基本技能,尽管在工作中有诸如 Sourcetree这样牛X的客户端工具,使得合并代码变的很方便。但找工作面试和…

    技术杂谈 2023年7月11日
    0104
  • RedisSCAN命令

    获取指定前缀的key 需求描述: Redis中有大量以xxx开头的key,在不使用keys命令的情况下,如何快速获取这些前缀的key 解决方案: redis自带的scan命令可以解…

    技术杂谈 2023年7月24日
    064
  • FineUIPro/Mvc/Core v7.1.1 正式发布了!

    注:本版本会于 2021-6-28 准时更新到社区 。 FineUIPro/Mvc/Core v7.1.1 正式发布了,这个版本主要是BUG修正,建议所有用户升级到此版本! 下面先…

    技术杂谈 2023年6月1日
    080
  • Linux系统下nginx的安装与卸载

    1.1 安装 准备依赖环境 1.安装 gcc 依赖库 yum install gcc-c++ 2.安装 PCRE pcre-devel 依赖库 yum install -y pcr…

    技术杂谈 2023年7月24日
    067
  • 线程池如何观测?这个方案让你对线程池的运行情况了如指掌!

    今天我们来聊一个比较实用的话题,动态可监控可观测的线程池实践。 这是个全新的开源项目,作者提供了一种非常好的思路解决了线程池的可观测问题。 这个开源项目叫: DynamicTp 地…

    技术杂谈 2023年7月11日
    086
  • webstorm中js文件被识别成txt类型

    问题描述: webstorm中index.js文件被识别成txt格式,如下图。 原因: webstorm中js文件被识别成txt文件,原因在于txt类型识别了以当前js文件名命名的…

    技术杂谈 2023年5月31日
    088
  • Linux的安装和配置

    Linux的安装和网络配置 CentOS7安装教程 https://www.php.cn/centos/472898.html 1.虚拟网络编辑器配置 通过VMware菜单栏,依次…

    技术杂谈 2023年7月11日
    082
  • Deepin 15.4 升级 chrome flash

    ~/.config/google-chrome/PepperFlash下建个目录 23.0.0.185,把 libpepflashplayer.so、manifest.json 拷…

    技术杂谈 2023年5月30日
    083
  • Go基础:基础语法与使用

    这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记。 1. 变量 声明变量 var a int var b string var c []float32 // 这种形式…

    技术杂谈 2023年7月24日
    068
  • 威胁分析和风险分析

    三个定义:威胁(Threat),指的是可能造成危害的来源。风险(Risk),可能造成的损失。漏洞,系统中可能被威胁利用从而造成危害的地方。 威胁分析就是把 系统中存在的威胁全部找出…

    技术杂谈 2023年6月21日
    0116
  • Who is using Asio?

    https://think-async.com/Asio/WhoIsUsingAsio Original: https://www.cnblogs.com/my_life/p/48…

    技术杂谈 2023年5月31日
    0103
  • 免费内网穿透服务Localtunnel

    全局安装 Localtunnel(需要 NodeJS)以使其在任何地方都可以访问: npm install -g localtunnel 在某个本地端口(例如 http://loc…

    技术杂谈 2023年6月21日
    0111
  • 面试必问的安卓虚拟机,你真的掌握了么?——安卓虚拟机基础知识回顾

    前言 21世纪,安卓虚拟机正在一步步的走入我们的生活,小到个人部分朋友在电脑上使用安卓虚拟机玩手游,大到安卓从业人员在虚拟机上面跑程序。不得不承认,对于每一位Androider 而…

    技术杂谈 2023年7月11日
    080
  • 验证token

    去测试登陆时,请求头一定要带token(authorization)信息,不然401错误。 Original: https://www.cnblogs.com/145Mirro-r…

    技术杂谈 2023年6月21日
    0101
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球