Tipos de transformaciones en un RDD en Apache Spark

Tipos de transformaciones en un RDD en Apache Spark

En este artículo vamos a hablar de los diferentes tipos de transformaciones que podemos aplicar a un RDD en Apache Spark.

Los RDD son inmutables y cada operación crea un nuevo RDD. Las dos operaciones principales que se pueden realizar en un RDD son transformaciones y acciones. En este caso nos centraremos en las transformaciones, y en específico en los tipos de transformaciones que podemos aplicar en un RDD en Apache Spark.

Las transformaciones cambian los elementos en el RDD. Algunos ejemplos pueden ser dividir el elemento de entrada, filtrar elementos y realizar cálculos de algún tipo. Varias transformaciones se pueden realizar en una secuencia; sin embargo, no se lleva a cabo ninguna ejecución durante la planificación.

Para las transformaciones, Spark las agrega al DAG (Directed Acyclic Graph) de cálculo y, sólo cuando el controlador solicita algunos datos, este DAG realmente se ejecuta. A esto se le llama evaluación perezosa (lazy evaluation).

Las transformaciones crean un nuevo RDD a partir de un RDD existente aplicando la lógica de transformación a cada uno de los elementos del RDD existente.

 

Tipos de transformaciones en un RDD

Las transformaciones se pueden dividir en cuatro categorías:

Transformaciones generales

Las transformaciones generales son funciones de transformación que manejan la mayoría de los casos de uso de propósito general. Estas aplican la lógica de transformaciones a los RDD existentes y generan un nuevo RDD. Las operaciones comunes de agregación, filtros, etc, se conocen como transformaciones generales. Algunos ejemplos de transformaciones generales son:

  • map
  • filter
  • flatMap
  • groupByKey
  • sortByKey
  • combineByKey
Transformaciones matemáticas o estadísticas

Las transformaciones matemáticas o estadísticas son funciones de transformación que manejan alguna funcionalidad estadística, y que generalmente aplican alguna operación matemática o estadística en RDDs existentes, generando un nuevo RDD. El muestreo es un gran ejemplo de esto y se usa a menudo en los programas Spark. Algunos ejemplos de transformaciones matemáticas o estadísticas son:

  • sampleByKey
  • randomSplit
Transformaciones de conjunto o relacionales

Las transformaciones de conjunto o relacionales son funciones de transformación que manejan transformaciones como uniones de conjuntos de datos y otras funciones algebraicas relacionales como cogrupo. Estas funciones funcionan aplicando la lógica de transformaciones a los RDD existentes y generando un nuevo RDD. Algunos ejemplos de transformaciones de conjunto o relacionales son:

  • cogroup
  • join
  • subtractByKey
  • fullOuterJoin
  • leftOuterJoin
  • rightOuterJoin
Transformaciones basadas en la estructura de los datos

Las transformaciones basadas en la estructura de los datos son funciones de transformación que operan en las estructuras de datos subyacentes del RDD, hablamos de las particiones en el RDD. En estas funciones usted puede trabajar directamente en las particiones sin tocar directamente los elementos/datos dentro del RDD. Estos son esenciales en cualquier programa Spark más allá de los programas simples donde necesita más control de las particiones y distribución de particiones en el clúster. Por lo general, las mejoras de rendimiento se pueden realizar redistribuyendo las particiones de datos de acuerdo con el estado del clúster y el tamaño de los datos, y los requisitos exactos del caso de uso. Algunos ejemplos de transformaciones basadas en la estructura de los datos son:

  • partitionBy
  • repartition
  • zipwithIndex
  • coalesce

Spark y Scala en Databricks: Big Data e ingeniería de datos

Trabajo desde niveles básicos hasta avanzados con RDD y DataFrame.

Algunas funciones de transformación

La siguiente es una la lista de algunas funciones de transformación disponibles en Spark.

TransformaciónDescripción
map(func)Devuelve un nuevo conjunto de datos distribuido formado al pasar cada elemento de la fuente a través de una función func.
filter(func)Devuelve un nuevo conjunto de datos formado a partir de la selección de aquellos elementos de la fuente en los que func devuelve verdadero.
flatMap(func)Similar a map, pero cada elemento de entrada se puede asignar a 0 o más elementos de salida (por lo que func debería devolver una Seq en lugar de un solo elemento).
mapPartitions(func)Similar a map, pero se ejecuta por separado en cada partición (bloque) del RDD, por lo que func debe ser de tipo Iterator => Iterator cuando se ejecuta en un RDD de tipo T.
mapPartitionsWithIndex(func)Similar a mapPartitions, pero también proporciona a func con un valor entero que representa el índice de la partición, por lo que func debe ser del tipo
(Int, Iterator) => Iterator cuando se ejecuta en un RDD de tipo T.
sample(withReplacement, fraction, seed)Muestrea una fracción de los datos, con o sin reemplazo, utilizando una semilla generadora de números aleatorios dada.
union(otherDataset)Devuelve un nuevo conjunto de datos que contiene la unión de los elementos en el conjunto de datos de origen y el argumento.
intersection(otherDataset)Devuelve un nuevo RDD que contiene la intersección de elementos en el conjunto de datos de origen y el argumento.
distinct([numTasks]))Devuelve un nuevo conjunto de datos que contiene los distintos elementos del conjunto de datos de origen.
groupByKey([numTasks])Cuando se invoca en un conjunto de datos de pares (K, V), devuelve un conjunto de datos de pares (K, Iterable). Nota: si está agrupando para realizar una agregación (como una suma o un promedio) sobre cada clave, el uso de reduceByKey o addedByKey producirá un rendimiento mucho mejor. De forma predeterminada, el nivel de paralelismo en la salida depende del número de particiones del RDD principal. Puede pasar un argumento numTasks opcional para establecer un número diferente de tareas.
reduceByKey(func, [numTasks])Cuando se invoca en un conjunto de datos de pares (K, V), devuelve un conjunto de datos de pares (K, V) donde los valores de cada clave se agregan utilizando la función de reducción dada, que debe ser del tipo (V,V) => V. Al igual que en groupByKey, el número de tareas de reducción se puede configurar a través de un segundo argumento opcional.
aggregateByKey(zeroValue)(seqOp, combOp,[numTasks])Cuando se invoca en un conjunto de datos de pares (K, V), devuelve un conjunto de datos de pares (K, U) donde los valores de cada clave se agregan utilizando las funciones de combinación dadas y un valor cero neutral. Permite un tipo de valor agregado que es diferente al tipo de valor de entrada, al tiempo que evita asignaciones innecesarias. Al igual que en groupByKey, el número de tareas de reducción se puede configurar a través de un segundo argumento opcional.
sortByKey([ascending], [numTasks])Cuando se invoca en un conjunto de datos de pares (K, V), devuelve un conjunto de datos de pares (K, V) ordenados por claves en orden ascendente o descendente, como se especifica en el argumento ascendente booleano.
join(otherDataset, [numTasks])Cuando se invoca en conjuntos de datos de tipo (K, V) y (K, W), devuelve un conjunto de datos de pares (K, (V, W)) con todos los pares de elementos para cada clave. Las uniones externas son
admitido a través de leftOuterJoin, rightOuterJoin y fullOuterJoin.
cogroup(otherDataset, [numTasks])Cuando se invoca en conjuntos de datos de tipo (K, V) y (K, W), devuelve un conjunto de datos de tuplas del tipo (K, (Iterable, Iterable)). Esta operación también se llama groupWith.
cartesian(otherDataset)Cuando se invoca en conjuntos de datos de tipos T y U, devuelve un conjunto de datos de pares (T, U) (todos los pares de elementos).
pipe(command, [envVars])Canaliza cada partición del RDD a través de un comando de shell, por ejemplo, un script Perl o bash. Los elementos del RDD se escriben en el stdin y las líneas de salida del stdout se devuelven como un RDD de tipo storing.
coalesce(numPartitions)Disminuye el número de particiones en el RDD a numPartitions. Muy útil para ejecutar operaciones de manera más eficiente después de filtrar un gran conjunto de datos.
repartition(numPartitions)Reorganiza los datos en el RDD aleatoriamente para crear más o menos particiones y equilibrarlos entre ellas. Esto siempre mezcla todos los datos a través de la red.
repartitionAndSortWithinPartitions(partitioner)Vuelva a particionar el RDD de acuerdo con el particionador dado y, dentro de cada partición resultante, ordena los registros por sus claves. Esto es más eficiente que llamar a repartition y luego ordenar dentro de cada partición.

Big Data y Spark: ingeniería de datos con Python y pyspark

Trabajo desde niveles básicos hasta avanzados con RDD y DataFrame.

Entradas creadas 26

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Publicaciones relacionadas

Comienza escribiendo tu búsqueda y pulsa enter para buscar. Presiona ESC para cancelar.

Volver arriba