started spark getting scala apache-spark mapreduce rdd key-value

getting - spark scala sql



Spark-Agrupar por clave y luego contar por valor (1)

Tengo pares clave-valor no únicos que he creado usando la función de map de una RDD Array[String]

val kvPairs = myRdd.map(line => (line(0), line(1)))

Esto produce datos de formato:

1, A 1, A 1, B 2, C

Me gustaría agrupar todas las claves por sus valores y proporcionar los recuentos para estos valores de la siguiente manera:

1, {(A, 2), (B, 1)} 2, {(C, 1)}

He intentado muchos intentos diferentes, pero lo más cerca que puedo llegar es con algo como esto:

kvPairs.sortByKey().countByValue()

Esto da

1, (A, 2) 1, (B, 1) 2, (C, 1)

También,

kvPairs.groupByKey().sortByKey()

Proporciona valor, pero todavía no está allí:

1, {(A, A, B)} 2, {(C)}

Traté de combinar los dos juntos:

kvPairs.countByValue().groupByKey().sortByKey()

Pero esto devuelve un error

error: value groupByKey no es miembro de scala.collection.Map [(String, String), Long]


Simplemente cuente los pares directamente y agrupe (si es necesario) después:

kvPairs.map((_, 1L)) .reduceByKey(_ + _) .map{ case ((k, v), cnt) => (k, (v, cnt)) } .groupByKey

Si desea gropuByKey después de la reducción, es posible que desee utilizar un particionador personalizado que solo considere el primer elemento de la clave. Puede verificar la división de RDD y hacer la agregación en nuevos RDD para una implementación de ejemplo.