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操作。