在scala中,我们如何聚合一个数组来确定每个键的计数以及相对于总数的百分比
我试图找到一种有效的方法来找到以下内容:在scala中,我们如何聚合一个数组来确定每个键的计数以及相对于总数的百分比,scala,apache-spark,aggregate,rdd,Scala,Apache Spark,Aggregate,Rdd,我试图找到一种有效的方法来找到以下内容: Int1=1或0,Int2=1..k(其中k=3)和Double=1.0 我想知道每个k中有多少个1或0 我需要找到数组总大小中3的结果百分比 输入为: val clusterAndLabel = sc.parallelize(Array((0, 0), (0, 0), (1, 0), (1, 1), (2, 1), (2, 1), (2, 0))) 所以在这个例子中: 我有:0,0=2,0,1=0 我有:1,0=1,1,1=1 我有:2,1=2,
val clusterAndLabel = sc.parallelize(Array((0, 0), (0, 0), (1, 0), (1, 1), (2, 1), (2, 1), (2, 0)))
所以在这个例子中:
我想做一些折衷,但我坚持认为它们都被认为是2键连接如果你想知道有多少个1和0,你可以做:
val rdd = clusterAndLabel.map(x => (x,1)).reduceByKey(_+_)
这将为您提供一个RDD[(Int,Int),Int]
,它精确地包含您描述的内容,意思是:[((0,0),2),((1,0),1),((1,1),1),((2,1),2),((2,0),1)]
。如果确实希望通过其第一个键收集它们,可以添加以下行:
val rdd2 = rdd.map(x => (x._1._1, (x._1._2, x._2))).groupByKey()
这将产生一个RDD[(Int,(Int,Int)]
,它将像您描述的那样,即:[(0,[(0,2)],(1,[(0,1),(1,1)],(2,[(1,2),(0,1)]
如果您需要实例的数量,那么(至少在您的示例中)clusterAndLabel.count()
应该完成这项工作
我真的不明白问题3?我可以看到两件事:
- 您想知道有多少个键出现了3次。为此,您可以从我称为
的对象(不需要groupByKey行)开始,然后执行以下操作:rdd
这将产生和val rdd3 = rdd.map(x => (x._2,1)).reduceByKey(_+_)
这是一种频率RDD:键是出现的次数,值是这个键被点击的次数。这里它看起来像:RDD[(Int,Int)]
。所以如果你想知道有多少对出现了3次,你只需要做[(1,3),(2,2)]
(这将是一个大小为0的数组,但如果它不是空的,那么它将有一个值,它将是您的答案)rdd3.filter(u 1==3.collect()
- 您想知道第一个键3出现的次数(在您的示例中再次为0)。然后从
开始执行以下操作:rdd2
再次,它将生成一个空数组或一个大小为1的数组,其中包含多少个元素的第一个键为3。请注意,如果不需要显示val rdd3 = rdd2.map(x=>(x._1,x._2.size)).filter(_._1==3).collect()
,可以直接执行此操作,只需执行以下操作:rdd2
(为了提高性能,您可能还需要在val rdd4 = rdd.map(x => (x._1._1,1)).reduceByKey(_+_).filter(_._1==3).collect()
之前进行筛选!)reduceByKey