Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在scala中,我们如何聚合一个数组来确定每个键的计数以及相对于总数的百分比_Scala_Apache Spark_Aggregate_Rdd - Fatal编程技术网

在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,

我试图找到一种有效的方法来找到以下内容:

  • 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,2,0=1
  • 总共是7个实例


    我想做一些折衷,但我坚持认为它们都被认为是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次。为此,您可以从我称为
      rdd
      的对象(不需要groupByKey行)开始,然后执行以下操作:

      val rdd3 = rdd.map(x => (x._2,1)).reduceByKey(_+_)
      
      这将产生和
      RDD[(Int,Int)]
      这是一种频率RDD:键是出现的次数,值是这个键被点击的次数。这里它看起来像:
      [(1,3),(2,2)]
      。所以如果你想知道有多少对出现了3次,你只需要做
      rdd3.filter(u 1==3.collect()
      (这将是一个大小为0的数组,但如果它不是空的,那么它将有一个值,它将是您的答案)

    • 您想知道第一个键3出现的次数(在您的示例中再次为0)。然后从
      rdd2
      开始执行以下操作:

      val rdd3 = rdd2.map(x=>(x._1,x._2.size)).filter(_._1==3).collect()
      
      再次,它将生成一个空数组或一个大小为1的数组,其中包含多少个元素的第一个键为3。请注意,如果不需要显示
      rdd2
      ,可以直接执行此操作,只需执行以下操作:

      val rdd4 = rdd.map(x => (x._1._1,1)).reduceByKey(_+_).filter(_._1==3).collect()
      
      (为了提高性能,您可能还需要在
      reduceByKey
      之前进行筛选!)


    此行缺少一个右参数:val rdd2=rdd.map(x=>(x._1._1,(x._1._2,x._2)).groupByKey()