Spark学习之编程进阶——累加器与广播(5)

Spark学习之编程进阶——累加器与广播(5)

1. Spark中两种类型的共享变量:累加器(accumulator)与广播变量(broadcast variable)。累加器对信息进行聚合,而广播变量用来高效分发较大的对象。

2. 共享变量是一种可以在Spark任务中使用的特殊类型的变量。

3. 累加器的用法:

  • 通过在驱动器中调用SparkContext.accumulator(initialValue)方法,创建出存有初始值的累加器。返回值为org.apache.spark.Accumlator[T]对象,其中T是初始值initialValue的类型。
  • Spark闭包里的执行器代码可以使用累加器的+=方法(在Java中是add)增加累加器的值。
  • 驱动器程序可以调用累加器的value属性(在Java中使用value()或setValue()来访问累加器的值。 Python中实现累加空行
    file = sc.textFile(inputFile)
    #创建Accumulator[Int]并初始化为0
    blankLines = sc.accumulator(0)

    def extractCallSigns(Line):
        globle blankLines #访问全局变量
        if (line == ""):
            blankLines += 1
            return line.split("")

    callSigns = file.flatMap(extractCallSigns)
    callSigns.saveAsTextFile(outputDir + "/callsigns")
    print "Blank lines:%d" % blankLines.value

4. Spark的广播变量,它可以让程序高效地向所有工作节点发送一个较大的只读值,以供一个或多个Spark操作使用。

Scala代码使用广播变量查询国家
    //查询RDD contactCounts中的呼号的对应位置。将呼号前缀
    //读取为国家代码进行查询
    val signPrefixes = sc.broadcast(loadCallSignTable())
    val countryContactCounts = contactCounts.map{case (sign,count) =>
        val country = lookupInArray(sign,signPrefixes.value)
        (country,count)
        }.reduceByKey((x,y) => x+y)
        countryContactCounts.saveAsTextFile(outputDir + "/countries.text")

5. Spark在RDD上提供pipe()方法。Spark的pipe()方法可以让我们使用任意一种语言实现Spark作业中的部分逻辑,只要它的读写Unix标准流就行。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Spark生态圈

[spark] RDD解析

每个具体的RDD都得实现compute 方法,该方法接受的参数之一是一个Partition 对象,目的是计算该分区中的数据。 我们通过map方法来看具体的实现...

831
来自专栏一名叫大蕉的程序员

Spark你一定学得会(一)No.7

我是小蕉。 上一篇大家说没有干货,妈蛋回南天哪来的干货你告诉我!!!还好这几天天气还不错,干货来了。 首先祭上今天关键代码,要做的事情就是从Hive表中取得年龄...

1855
来自专栏浪淘沙

SparkStreaming_Kafka_Redis整合

1713
来自专栏行者悟空

Spark核心数据结构RDD的定义

1984
来自专栏猿天地

Netty-整合kryo高性能数据传输

前言 本篇文章是Netty专题的第三篇,前面2篇文章如下: 高性能NIO框架Netty入门篇 高性能NIO框架Netty-对象传输 Netty 是 开源的基于j...

73912
来自专栏Albert陈凯

4.2 创建RDD

4.2 创建RDD 由于Spark一切都是基于RDD的,如何创建RDD就变得非常重要,除了可以直接从父RDD转换,还支持两种方式来创建RDD: 1)并行化一个...

3049
来自专栏xingoo, 一个梦想做发明家的程序员

[大数据之Spark]——快速入门

本篇文档是介绍如何快速使用spark,首先将会介绍下spark在shell中的交互api,然后展示下如何使用java,scala,python等语言编写应用。...

1899
来自专栏https://www.cnblogs.com/L

【Spark篇】---Spark中广播变量和累加器

Spark中因为算子中的真正逻辑是发送到Executor中去运行的,所以当Executor中需要引用外部变量时,需要使用广播变量。

861
来自专栏Spark生态圈

[spark] Checkpoint 源码解析

在spark应用程序中,常常会遇到运算量很大经过很复杂的 Transformation才能得到的RDD即Lineage链较长、宽依赖的RDD,此时我们可以考虑将...

1252
来自专栏伦少的博客

Spark性能优化:基于分区进行操作

基于分区对数据进行操作可以让我们避免为每个数据元素进行重复的配置工作。诸如打开数据库连接或创建随机数生成器等操作,都是我们应当尽量避免为每个元素都配置一次的工作...

1471

扫码关注云+社区