spark的aggregateByKey简单用法

本文介绍了一种使用Spark的aggregateByKey方法来处理数据集中key出现次数的方法,并提供了一个具体的实现示例。通过该方法可以有效地找出那些仅出现一次的key。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


问题:求key只出现一次的数据, 如果用groupByKey或reduceByKey很容易就做出来了,现在用aggregateByKey求解一下。


输入数据:

asdfgh	546346
retr	4567
asdfgh	7685678
ghj	2345
asd	234
hadoop	435
ghj	23454
asdfgh	54675
asdfgh	546759878
asd	234
asdfgh	5467598782

代码:

package scala

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

import scala.collection.mutable
import scala.collection.JavaConverters._

object AaidTest {
  def main(args: Array[String]): Unit = {
    val conf=new SparkConf().setAppName("AaidTest").setMaster("local")
    val sc=new SparkContext(conf)

    sc.textFile("D://sparkmllibData/sparkml/mllibdata/arrregation.txt")
      .map(line=>{
        (line.split("\t")(0),line.split("\t")(1).toLong)
      }).aggregateByKey(0L)(seqOp,seqOp)
        .filter(line=> line._2!=-1L)
      .collect().foreach(println)

  }

  def seqOp(U : (Long), v : (Long)) : Long = {
    println("seqOp")
    println("U="+U)
    println("v="+v)
    var count:Int=0
    if(U!=0L){
      count+=1
    }
    if(v!=0L){
      count+=1
    }
    if(count>1){
      -1L
    }else{
      v
    }
  }
}

输出结果:

seqOp
U=0
v=546346
seqOp
U=0
v=4567
seqOp
U=546346
v=7685678
seqOp
U=0
v=2345
seqOp
U=0
v=234
seqOp
U=0
v=435
seqOp
U=2345
v=23454
seqOp
U=1
v=54675
seqOp
U=1
v=546759878
seqOp
U=234
v=234
seqOp
U=1
v=5467598782
(hadoop,435)
(retr,4567)


很明显,达到最后的要求了。



`aggregateByKey`是Spark的核心操作之一,除了Scala之外,它还支持Java、Python和R等多种语言。这里我将介绍Java和Python中如何使用`aggregateByKey`操作。 Java中使用`aggregateByKey`操作的方法与Scala类似,只是语法有所不同。下面是一个Java中使用`aggregateByKey`操作求每个key的平均值的示例: ```java JavaPairRDD<Integer, Integer> data = sc.parallelizePairs( Arrays.asList( new Tuple2<>(1, 2), new Tuple2<>(1, 4), new Tuple2<>(2, 1), new Tuple2<>(2, 3), new Tuple2<>(2, 5) ) ); JavaPairRDD<Integer, Tuple2<Integer, Integer>> aggregatedData = data.aggregateByKey( new Tuple2<>(0, 0), (acc, value) -> new Tuple2<>(acc._1 + value, acc._2 + 1), (acc1, acc2) -> new Tuple2<>(acc1._1 + acc2._1, acc1._2 + acc2._2) ); JavaPairRDD<Integer, Double> avgByKey = aggregatedData.mapValues(v -> v._1.doubleValue() / v._2); avgByKey.foreach(t -> System.out.println(t._1 + ": " + t._2)); ``` 在这个示例中,我们首先创建了一个JavaPairRDD,然后使用`aggregateByKey`操作对每个key对应的value求和和计数。接着,我们使用`mapValues`操作将每个key对应的sum和count求平均值,最后输出结果。 Python中使用`aggregateByKey`操作也很简单,下面是一个Python中使用`aggregateByKey`操作求每个key的平均值的示例: ```python from pyspark import SparkContext sc = SparkContext("local", "aggregateByKey example") data = sc.parallelize([(1, 2), (1, 4), (2, 1), (2, 3), (2, 5)]) aggregated_data = data.aggregateByKey((0, 0), lambda acc, value: (acc[0] + value, acc[1] + 1), lambda acc1, acc2: (acc1[0] + acc2[0], acc1[1] + acc2[1])) avg_by_key = aggregated_data.mapValues(lambda v: float(v[0]) / v[1]) for k, v in avg_by_key.collect(): print(k, v) ``` 在这个示例中,我们使用SparkContext创建了一个本地Spark应用程序,然后创建了一个RDD。接着,我们使用`aggregateByKey`操作对每个key对应的value求和和计数。最后,我们使用`mapValues`操作将每个key对应的sum和count求平均值,并输出结果。 希望这些示例能够帮助您更好地理解`aggregateByKey`操作在Java和Python中的使用方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值