zoukankan      html  css  js  c++  java
  • scala flatmap、reduceByKey、groupByKey

    1、test.txt文件中存放

    asd sd fd gf g 
    dkf dfd dfml dlf
    dff gfl pkdfp dlofkp
    // 创建一个Scala版本的Spark Context
    val conf = new SparkConf().setAppName("wordCount")
    val sc = new SparkContext(conf)
    // 读取我们的输入数据
    val input = sc.textFile(inputFile)
    // 把它切分成一个个单词
    val words = input.flatMap(line => line.split(" "))

    //words为------------------ 

    asd

    sd

    fd

    gf

    g

    dkf

    dfd

    dfml

    dlf

    dff

    gfl

    pkdfp

    dlofkp

    val counts = words.map(word => (word, 1)).reduceByKey{case (x, y) => x + y}
    // 将统计出来的单词总数存入一个文本文件,引发求值
    counts.saveAsTextFile(outputFile)

    //reduceByKey  合并key计算 

    2、reduceByKey  合并key计算 

    按key求和 
    val rdd = sc.parallelize(List((“a”,2),(“b”,3),(“a”,3)))
    
    合并key计算 
    val r1 = rdd.reduceByKey((x,y) => x + y)
    
    输出结果如下
    
    (a,5)
    (b,3)

    reduceByKey:reduceByKey会在结果发送至reducer之前会对每个mapper在本地进行merge,有点类似于在MapReduce中的combiner。

    这样做的好处在于,在map端进行一次reduce之后,数据量会大幅度减小,从而减小传输,保证reduce端能够更快的进行结果计算。

    groupByKey:groupByKey会对每一个RDD中的value值进行聚合形成一个序列(Iterator),

    此操作发生在reduce端,所以势必会将所有的数据通过网络进行传输,造成不必要的浪费。

    同时如果数据量十分大,可能还会造成OutOfMemoryError。

    通过以上对比可以发现在进行大量数据的reduce操作时候建议使用reduceByKey。

    不仅可以提高速度,还是可以防止使用groupByKey造成的内存溢出问题。

     

  • 相关阅读:
    ADB server didn't ACK * failed to start daemon *
    老调重弹:年龄大了,码农何去何从(转)
    HR给应届生的黄金面试技巧
    Android自动开关机实现
    [Android实例] Android ShakeDetector(摇晃检测)教程详解
    Hadoop : MapReduce中的Shuffle和Sort分析
    获得和裁剪图片
    android bitmap compress(图片压缩)
    知识签名(signature of knowledge)
    SVN安装(eclipse)
  • 原文地址:https://www.cnblogs.com/ggzhangxiaochao/p/9395994.html
Copyright © 2011-2022 走看看