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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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/spark获取排序rdd中的最大值_Scala_Apache Spark - Fatal编程技术网

使用scala/spark获取排序rdd中的最大值

使用scala/spark获取排序rdd中的最大值,scala,apache-spark,Scala,Apache Spark,我有这样的日志: ERROR: Error fetching remote repo 'origin' ... ERROR: SVN Problem .. ERROR: Error fetching remote repo 'origin' ERROR: Error fetching remote repo 'origin' 我编写了以下函数,根据错误发生的次数对错误进行排序: val getErrorLines=lines.filter(value=>value.startsWith(

我有这样的日志:

ERROR: Error fetching remote repo 'origin'
...
ERROR: SVN Problem
..
ERROR: Error fetching remote repo 'origin'
ERROR: Error fetching remote repo 'origin'
我编写了以下函数,根据错误发生的次数对错误进行排序:

val getErrorLines=lines.filter(value=>value.startsWith("ERROR"))
val mappedErrors=getErrorLines.map((s => {
val substrings = s.split(":")
(substrings(1), substrings(0))
})).map(value=>(value,1)).reduceByKey(_+_).sortBy(_._2, false, 1)
我能够根据错误发生的次数获得已排序的错误列表:

(( Error fetching remote repo 'origin',ERROR),5)
(( SVN Problem,ERROR),1)
但我只想要发生率最高的错误,即:

(( Error fetching remote repo 'origin',ERROR),5)
我在sort上管道化了top()函数,但它仍然给了我:

(( SVN Problem,ERROR),1)

有没有其他函数可以根据值为我提供最大的发生率?

最简单的解决方案是
交换

val substrings = sc.parallelize(Seq(
  (("Error fetching remote repo 'origin'", "ERROR"), 5),
  (("SVN Problem", "ERROR"), 1)
))

substrings.map(_.swap).top(1)
// Array[(Int, (String, String))] = Array((5,(Error fetching remote repo 'origin',ERROR)))

您可以在
RDD

如果默认结果不适合您的用例,您可以发送一个排序函数。我认为在你的例子中,因为最高值是元组第二部分中整数最高的那一个,所以这很好:

rdd.max()(Ordering[Int].on(x=>x._2))
快速测试:


我会先使用

val mostFrequentError = 
s.split(":")(substrings(1), substrings(0))}))
.map(value=>(value,1))
.reduceByKey(_+_)
.sortBy(_._2, false, 1)
.first() 

如果有两种以上的错误类型,那么交换将没有帮助,因为它会给出不同的输出。不过这是个不错的选择。谢谢@Keshavpradepramanath交换是一种
Tuple2
的方法,交换元素,使计数位于第一位,top将按计数排序。这一种有效。在这种情况下,我们需要与所处理的值相关联的排序函数。对吗?实际上,您根本不需要对rdd进行排序。无论是否订购rdd,Max函数的工作原理相同