使用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函数的工作原理相同