`combineByKey`, pyspark

Sólo me pregunto qué hace exactamente esto? Entiendo keyBy , pero lucho por lo que exactamente es que combineByKey . He leído las páginas (enlace) y todavía no entiendo.

 df.rdd.keyBy( lambda row: row['id'] ).combineByKey( lambda row: [row], lambda rows, row: rows + [row], lambda rows1, rows2: rows1 + rows2, ) ) 

En resumen, combineByKey le permite especificar explícitamente las 3 etapas de agregar (o reducir) su rdd.

1. ¿Qué se hace en una sola fila cuando se cumple PRIMERO?

En el ejemplo que ha proporcionado, la fila se coloca en una lista.

2. ¿Qué se hace con una sola fila cuando se encuentra con una fila previamente reducida?

En el ejemplo, una fila previamente reducida ya es una lista y le agregamos la nueva fila y devolvemos la nueva lista extendida.

3. ¿Qué se hace a dos filas previamente reducidas?

En el ejemplo anterior, ambas filas ya son listas y devolvemos una nueva lista con los elementos de ambos.

Más ejemplos bien explicados, paso a paso, están disponibles en esos enlaces:

http://hadoopexam.com/adi/index.php/spark-blog/90-how-combinebykey-works-in-spark-step-by-step-explaination

http://etlcode.com/index.php/blog/info/Bigdata/Apache-Spark-Difference-between-reduceByKey-groupByKey-and-combineByKey

Una explicación clave del segundo enlace es:

introduzca la descripción de la imagen aquí

Veamos cómo funciona combineByKey en nuestro caso de uso. Cuando combineByKey navega a través de cada elemento, es decir, para la partición 1 – (Messi, 45) tiene una clave que no ha visto antes y cuando se mueve a la siguiente (Messi, 48) obtiene una clave que ha visto antes. Cuando vea un elemento por primera vez, combineByKey () use la función llamada createCombiner para crear un valor inicial para el acumulador en esa clave. es decir, usa Messi como clave y 45 como valor. Así que el valor actual del acumulador de esa clave (Messi) se convierte en 45. Ahora, la próxima vez que combineByKey () vea la misma clave en la misma partición, no use createCombiner, sino que usará la segunda función mergeValue con el valor actual del acumulador (45) y nuevo valor 48.

Dado que todo esto sucede en paralelo en una partición diferente, existe la posibilidad de que exista la misma clave en otra partición con otro conjunto de acumuladores. Por lo tanto, cuando los resultados de diferentes particiones deben combinarse, se usa la función mergeCombiners.