spark 算子例子_Spark——人性化理解

3fe817393ac3a5f6470bad522faa6d1e.png

最近刚刚接触spark,对它的很多东西不是很理解,目前先整理一些浅显易懂的,便于后期查阅~

本文希望用浅(ren)显(hua)的语言进行解释说明,方便自己和大家查看~


一、Spark含义

Spark,其实就是数据处理框架,就是基于内存计算的通用大规模数据处理框架

Spark的出现是因为要弥补Hadoop的不足,那Hadoop又有什么不足呢?

  • Hadoop中的MapReduce的表达能力弱:不是所有的数据分析模型都可以表达成map和reduce两阶段的。
  • Hadoop中的MapReduce短板问题:必须等待所有的Map都执行完才能执行reduce。
  • 写入磁盘耗时:Hadoop中间处理的时候需要写入磁盘,虽然每次写入时间很短,可能也就几秒,但是扛不住数量多啊,数量非常大的时候,写入时间问题就被放大啦~

基于以上问题,Spark横空出世!!!

  • 表达能力强:提供Java、Scala、Python和R几种语言的API,支持SQL、机器学习和图计算,覆盖了绝大多数大数据计算的场景。
  • 不存在短板问题:因为没有MapReduce,采用函数式编程方法。
  • 写入内存省时:中间计算过程写入内存,不要反复读取磁盘。

二、RDD——Spark中最重要的一个知识点

先来看一个例子,统计词个数的例子(已经被用烂~):

    val batchSize = 10
    val sparkConf = new SparkConf().setAppName("SparkTest").setMaster("local")
    val ssc = new StreamingContext(sparkConf, new Duration(batchSize * 1000))

    val textFile = ssc.sparkContext.textFile("data/sparkTestFile")
    textFile.foreach(println)
    val words = textFile.flatMap(line => line.split(" "))
    words.foreach(println)
    val word_pairs = words.map(word => (word, 1))
    word_pairs.foreach(println)
    val word_counts = word_pairs.reduceByKey(_+_)
    word_counts.foreach(println)

下面我们分别看一下每句的含义与运行结果:

1. 首先打印一下文件里的内容:

    val textFile = ssc.sparkContext.textFile("data/sparkTestFile")
    textFile.foreach(println)

6bd75df24bcfbaa2918124ce215f36cc.png

2. 进行flatMap扁平化处理:

    val words = textFile.flatMap(line => line.split(" "))
    words.foreach(println)

870a2f08045188f84b4c8335812c210a.png

3. 将每个单词设置个数为1:

    val word_pairs = words.map(word => (word, 1))
    word_pairs.foreach(println)

35661ea4929124af53737a5901a2c3d9.png

4. 对每个词进行统计个数,相同词合并

    val word_counts = word_pairs.reduceByKey(_+_)
    word_counts.foreach(println)

8680ea019f3e249bade6e1d09457658c.png

这四步,每一步就是一个rdd,rdd说的通俗一点就是一个数据集,再通俗一点,就是给数据起个名字~

比如,我将一个文本内容读取出来,那么我怎么称呼这些内容呢?我就可以用rdd统一称呼它,也不管它里面是什么形式的数据。而我对数据扁平化处理后,仍然可以用rdd称呼处理后的数据,只不过此rdd非彼rdd,可以理解为处理之前为rdd1,处理之后为rdd2~

三、懒加载

RDD包含两种算子:Transformation、Action算子。

  • Transformation:
    • map, mapPartitions, flatMap, filter, union, groupbyKey, repartition, cache
  • Action
    • reduce, collect, show, count, foreach, save

Transformation操作是将一个rdd转换成另一个rdd,这些操作不会立即被执行,而是等到触发Action操作时才被执行,感觉有点类似于TensorFlow,先定义着,用的时候再处理。这样维护起来更容易,速度也更快,同时又降低了复杂度。


今天先写到这吧~下次在补充~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值