spark学习记录之withColumn重复计算

在使用Spark,尤其是Spark SQL时,经常会出现一些奇奇怪怪的效率低下问题。比如说,如果lineage比较长的时候,或者lineage比较复杂需要shuffle的时候,可能存在一定的rdd复用问题。

通常在需要复用一个rdd的时候,建议进行persist。但是在实际情况下,又会经常出现不确定是否存在复用的问题。(主要对Spark理解不够深)

下面举一个例子进行学习

spark学习记录之withColumn重复计算

将箭头指向的map称作map1,右边两个map称作map2.

可以看到,rdd5是由rdd3和rdd4进行union得到,而rdd3和rdd4都最终来自于rdd1,rdd1到rdd2的map1实际承担了两条线路,所以按道理来说应该会执行两次。

rdd1 = sc.parallelize([[i, i+100] for i in range(10)], numSlices=50)
accumulator = sc.accumulator(0)

def map1(x):
    accumulator.add(1)
    return x

def map2(x):
    return x

rdd2 = rdd1.map(map1)
rdd2.persist()

rdd3 = rdd2.map(map2)
rdd4 = rdd2.map(map2)

rdd5 = rdd3.union(rdd4)

rdd5.collect()
print(accumulator.value)

输出为20。因为rdd1中有10个元素,对应两遍map让累加器变为20.

如果对rdd2进行persist,这样就切断rdd2之前的dag,所以map1只需计算一遍。累加器的计算结果果然为10。

再看Spark SQL

用DataFrame实现上述步骤

df1 = spark.createDataFrame([[i, i+100] for i in range(10)]).toDF("a", 'v').repartition(50)
accumulator = sc.accumulator(0)

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

@udf
def map2(x):
    return x

df2 = df1.withColumn("b", map1("a"))

df3 = df2.withColumn("c", map2("b"))
df4 = df2.withColumn("c", map2("b"))
df5 = df3.union(df4)

df5.collect()
print(accumulator.value)

输出结果竟然是40?

先把df2.persist()一下看看,输出结果为10,这就合理多了。

但是为什么会出现40这个结果。原来是withColumn这个函数使用不当。。。。

学艺不精,惭愧。

df5.columns为[‘a’, ‘v’, ‘b’, ‘c’]

因为是union而来,’b’列执行了两次map1,’c’由’b’经map2得到,’c’因为’b’也需要两次map1,所以一共4次,输出40。

如果不需要’b’,仅select出[‘a’, ‘v’, ‘c’], 这样只需要两次,输出结果也与预期一样是20.

归根结底,最后还是要看DataFrame用到了哪些数据,这些列是怎么来的。

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

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

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

(0)

大家都在看

  • lamba: lamba变量申明

    1,下面编译运行没问题 2,如果想在lamba中引用外围变量x,是无法做到的,如下会报错,类型不匹配了 error C2440: “初始化”: 无法从&#8…

    技术杂谈 2023年5月31日
    069
  • Python 获取字典中的第一个键

    提供两种方法: 使用 list 将字典的 key 转换成列表,然后取第一个元素 [0]。如果想要最后一个 key 的话,就取最后一个元素 [-1]。 >>> my…

    技术杂谈 2023年6月21日
    089
  • 9、Swift协程详解:其他语言异步函数互调用

    从异步回调到异步函数 截止目前,我们已经详细探讨了 Swift 协程当中的绝大多数语法设计,这其中最基本也是最重要的就是异步函数。 在异步函数出现之前,我们通常会为函数添加回调来实…

    技术杂谈 2023年6月1日
    070
  • 面试官:你说你精通Redis,你看过持久化的配置吗?

    前边我们已经介绍了 Redis 五种数据类型的命令与 配置文件的基本配置,今天让我们从理论和配置两个层面来揭开 Redis持久化的神秘面纱。 所谓持久化可以简单理解为将内存中的数据…

    技术杂谈 2023年7月11日
    070
  • GCC编译C:C++的四个过程

    从源码到可执行程序,经历四个过程: 预处理、编译、汇编和链接,前三步由使用编译器来完成、链接由链接来完成。 编译器将编译工作主要分为预处理,编译和汇编三部 连接器的工作是把各个独立…

    技术杂谈 2023年7月11日
    054
  • GCC常见命令

    rwx 对于目录和文件的区别 文件 目录 r 文件的内容可以被查看。支持cat、more、head…vim 目录的内容可以被查看。ls、tree w 文件的内容可以被添…

    技术杂谈 2023年6月21日
    0115
  • Django点击图片缩放

    参考信息 用 zoom.js 给博客园中博文的图片添加单击时弹出放大效果:https://www.cnblogs.com/mingc/p/7446492.html 使用 1. 下载…

    技术杂谈 2023年6月21日
    0111
  • 创建线程有几种方式?

    创建线程的几种方式 1️⃣ 继承 Thread 类 继承 Thread 类创建线程的步骤为: 1)创建一个类继承Thread类,重写run()方法,将所要完成的任务代码写进run(…

    技术杂谈 2023年6月21日
    080
  • Promise.all和Promise.race的区别

    Promise.all()可以将多个实例组装个成一个新实例,成功的时候返回一个成功的数组;失败的时候则返回最先被reject失败状态的值。 适用场景:比如当一个页面需要在很多个模块…

    技术杂谈 2023年6月1日
    086
  • linux基本命令

    cd 切换文件夹 cd /home 绝对路径 以包目录开头 cd admin 相对路径 不以包目录开头 cd .. 返回上级目录 cd ~ 到自己的家目录 /home/admin …

    技术杂谈 2023年7月24日
    071
  • SQL的外键知识

    SQL 的外键,其实用的很多,但是在学数据库的时候,这是放在后面的内容。容易造成忽视。 定义一个含有外键约束的表 CREATE TABLE Orders ( Id_O int NO…

    技术杂谈 2023年7月11日
    071
  • 大白话布隆过滤器

    本文是站在小白的角度去讨论布隆过滤器,如果你是科班出身,或者比较聪明,又或者真正想完全搞懂布隆过滤器的可以移步。 不知道从什么时候开始,本来默默无闻的布隆过滤器一下子名声大燥,仿佛…

    技术杂谈 2023年7月25日
    088
  • cgroup-v1在android中的应用实现浅析

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年7月10日
    060
  • veer图库网站爬取

    记录一下当时同学托我帮写的爬取veer图库链接的python代码 csharp;gutter:true;</p> <h1>!/usr/bin/env pyt…

    技术杂谈 2023年6月21日
    0121
  • MySQL的简单实用 手把手教学

    MySQL的使用 1.登陆数据库 打开terminal 在终端根文件目录下输入 /usr/local/mysql/bin/mysql -u root -p 接着输入管理员密码 2….

    技术杂谈 2023年7月25日
    076
  • 从同步函数 hello-world-dotnet 开始探索OpenFunction

    OpenFunction[1] 是一个现代化的云原生 FaaS(函数即服务)框架,它引入了很多非常优秀的开源技术栈,包括 Knative、Tekton、Shipwright、Dap…

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