Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.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 - Fatal编程技术网

Scala 按索引最常出现的元素

Scala 按索引最常出现的元素,scala,apache-spark,Scala,Apache Spark,我有一个数组的形式 val array: Array[(Int, (String, Int))] = Array( (idx1,(word1,count1)), (idx2,(word2,count2)), (idx1,(word1,count1)), (idx3,(word3,count1)), (idx4,(word4,count4))) 我想从这个数组中为每个索引(idx1,idx2,…)获取前10个和后10个元素。基本上,我想要每个索引值的前10个最常见元素和后10

我有一个数组的形式

val array: Array[(Int, (String, Int))] = Array(
  (idx1,(word1,count1)),
  (idx2,(word2,count2)),
  (idx1,(word1,count1)),
  (idx3,(word3,count1)),
  (idx4,(word4,count4)))
我想从这个数组中为每个索引(idx1,idx2,…)获取前10个和后10个元素。基本上,我想要每个索引值的前10个最常见元素和后10个最不常见元素

请建议如何以最有效的方式实现火花。 我曾尝试对每个索引使用for循环,但这会使程序速度太慢,并按顺序运行

例如:

(0,("apple",1))
(0,("peas",2))
(0,("banana",4))

(1,("peas",2))
(1,("banana",1))
(1,("apple",3))

(2,("NY",3))
(2,("London",5))
(2,("Zurich",6))

(3,("45",1))
(3,("34",4))
(3,("45",6))


Suppose I do top 2 on this set output would be 

    (0,("banana",4))
    (0,("peas",2))

    (1,("apple",3))
    (1,("peas",2))

    (2,("Zurich",6))
    (2,("London",5))

    (3,("45",6))
    (3,("34",4))

同样,我也需要底部2,但我不确定spark,但我认为您可以选择以下内容:

def f(array: Array[(Int, (String, Int))], n:Int) = 
  array.groupBy(_._1)
    .map(pair => (
           pair._1, 
           pair._2.sortBy(_._2).toList
         ) 
     )
    .map(pair => (
           pair._1, 
           (
              pair._2.take(Math.min(n, pair._2.size)),          
              pair._2.drop(Math.max(0, pair._2.size - n))
           )
         )
     )
groupBy将索引映射返回到按频率排序的条目列表中。然后,将这些条目映射到一对列表,一个包含前n个元素,另一个包含后n个元素。请注意,您可以将所有命名的参数替换为x,我这样做是为了清楚起见


此版本假定您始终对计算top和bot n元素感兴趣,因此只需一次即可计算这两个元素。如果您通常只需要这两个选项中的一个,那么在toList之后立即添加.take或.drop会更有效。

我知道这相当于在(K,V)对上使用groupByKey,然后对其执行排序操作,从而生成整个列列表。虽然该操作是正确的,但在典型的spark环境中,groupByKey操作将涉及大量无序输出,这可能导致操作效率低下。

我不清楚您想要什么。您有两个条目(idx1,(word1,count1))。当计算idx1的元素时,这些元素是否要合并为一个(字1,count1*2)?输入和输出的具体示例如下:help@Paul...edited我的问题是关于输入和输出的例子。我根据我们是否保证,对于任何特定的索引,单词都是唯一的来修正我的答案?(注意,您的第一个示例没有这样做-有两个
(idx1,(word1,count1))
条目)索引词中的yes将是唯一的,因为这是reduceByKey操作的输出。请忽略给出的例子中的两面性。我不认为这是OP想要的(尽管还不完全清楚)。我认为每个索引需要的是最上面和最下面的10个单词,而不是单词最多的10个索引…你应该修正到
sortBy(entry=>entry.\u 2.\u 2)
你的地图应该返回两个东西-最上面的10个和最下面的10个。那么你可以一次完成吗?我以为他想让top和bot的功能分开。在answerUsing groupBy中添加了同时计算这两个数据的选项,这真的会挂起我的程序…我正在处理一个包含2259748行和512列的数据集。一些spark文档不鼓励使用groupBy操作。