Eu tenho um par de faíscas RDD (key, count) como abaixo
Array[(String, Int)] = Array((a,1), (b,2), (c,1), (d,3))
Como encontrar a chave com maior contagem usando a API spark scala?
EDIT: tipo de dados do par RDD é org.apache.spark.rdd.RDD [(String, Int)]
Use o método Array.maxBy
:
val a = Array(("a",1), ("b",2), ("c",1), ("d",3)) val maxKey = a.maxBy(_._2) // maxKey: (String, Int) = (d,3)
ou RDD.max
:
val maxKey2 = rdd.max()(new Ordering[Tuple2[String, Int]]() { override def compare(x: (String, Int), y: (String, Int)): Int = Ordering[Int].compare(x._2, y._2) })
Use takeOrdered(1)(Ordering[Int].reverse.on(_._2))
:
val a = Array(("a",1), ("b",2), ("c",1), ("d",3)) val rdd = sc.parallelize(a) val maxKey = rdd.takeOrdered(1)(Ordering[Int].reverse.on(_._2)) // maxKey: Array[(String, Int)] = Array((d,3))
Para o Pyspark:
Seja a
par o RDD com chaves como String e valores como inteiros então
a.max(lambda x:x[1])
retorna o par de valores da chave com o valor máximo. Basicamente as ordens max da function pelo valor de retorno da function lambda.
Aqui a
é um par RDD com elementos como ('key',int)
e x[1]
apenas se refere à parte inteira do elemento.
Note que a function max
por si só irá ordenar por chave e retornar o valor máximo.
A documentação está disponível em https://spark.apache.org/docs/1.5.0/api/python/pyspark.html#pyspark.RDD.max
Os RDDs Spark são mais eficientes no tempo quando são deixados como RDD e não transformados em Matrizes
strinIntTuppleRDD.reduce((x, y) => if(x._2 > y._2) x else y)