Spark groupByKey alternativa

De acuerdo con las mejores prácticas de Databricks, Spark groupByKey debe evitarse, ya que el procesamiento de Spark groupByKey funciona de manera que la información se groupByKey primero entre los trabajadores y luego se realizará el procesamiento. Explicación

Entonces, mi pregunta es, ¿cuáles son las alternativas para groupByKey de una manera que devolverá lo siguiente de manera distribuida y rápida?

 // want this {"key1": "1", "key1": "2", "key1": "3", "key2": "55", "key2": "66"} // to become this {"key1": ["1","2","3"], "key2": ["55","66"]} 

Me parece que quizás aggregateByKey o glom podrían hacerlo primero en la partición ( map ) y luego unir todas las listas ( reduce ).

groupByKey está bien para el caso cuando queremos una colección “pequeña” de valores por clave, como en la pregunta.

TL; DR

La advertencia “no usar” en groupByKey aplica a dos casos generales:

1) Desea agregar sobre los valores:

  • NO : rdd.groupByKey().mapValues(_.sum)
  • DO : rdd.reduceByKey(_ + _)

En este caso, groupByKey desperdiciará recursos materializando una colección, mientras que lo que queremos es un solo elemento como respuesta.

2) Desea agrupar colecciones muy grandes sobre claves de cardinalidad baja:

  • DON’T : allFacebookUsersRDD.map(user => (user.likesCats, user)).groupByKey()
  • SOLO NO

En este caso, groupByKey podría groupByKey un error de OOM.

groupByKey materializa una colección con todos los valores para la misma clave en un ejecutor. Como se mencionó, tiene limitaciones de memoria y, por lo tanto, otras opciones son mejores dependiendo del caso.

Todas las funciones de agrupación, como groupByKey , aggregateByKey y reduceByKey basan en la base: combineByKey y, por lo tanto, ninguna otra alternativa será mejor para el caso de uso en la pregunta, todas se basan en el mismo proceso común.