Using reduceByKey in Apache Spark (Scala)

前端 未结 3 1642
囚心锁ツ
囚心锁ツ 2020-12-24 02:23

I have a list of Tuples of type : (user id, name, count).

For example,

val x = sc.parallelize(List(
    (\"a\", \"b\", 1),
    (\"a\", \"b\", 1),
           


        
相关标签:
3条回答
  • 2020-12-24 03:11

    The syntax is below:

    reduceByKey(func: Function2[V, V, V]): JavaPairRDD[K, V],
    

    which says for the same key in an RDD it takes the values (which will be definitely of same type) performs the operation provided as part of function and returns the value of same type as of parent RDD.

    0 讨论(0)
  • 2020-12-24 03:13

    Following your code:

    val byKey = x.map({case (id,uri,count) => (id,uri)->count})
    

    You could do:

    val reducedByKey = byKey.reduceByKey(_ + _)
    
    scala> reducedByKey.collect.foreach(println)
    ((a,d),1)
    ((a,b),2)
    ((c,b),1)
    

    PairRDDFunctions[K,V].reduceByKey takes an associative reduce function that can be applied to the to type V of the RDD[(K,V)]. In other words, you need a function f[V](e1:V, e2:V) : V . In this particular case with sum on Ints: (x:Int, y:Int) => x+y or _ + _ in short underscore notation.

    For the record: reduceByKey performs better than groupByKey because it attemps to apply the reduce function locally before the shuffle/reduce phase. groupByKey will force a shuffle of all elements before grouping.

    0 讨论(0)
  • 2020-12-24 03:16

    Your origin data structure is: RDD[(String, String, Int)], and reduceByKey can only be used if data structure is RDD[(K, V)].

    val kv = x.map(e => e._1 -> e._2 -> e._3) // kv is RDD[((String, String), Int)]
    val reduced = kv.reduceByKey(_ + _)       // reduced is RDD[((String, String), Int)]
    val kv2 = reduced.map(e => e._1._1 -> (e._1._2 -> e._2)) // kv2 is RDD[(String, (String, Int))]
    val grouped = kv2.groupByKey()            // grouped is RDD[(String, Iterable[(String, Int)])]
    grouped.foreach(println)
    
    0 讨论(0)
提交回复
热议问题