Transformaciones predefinidas en el SDK de Cloud Dataflow

Los SDK de Dataflow proporcionan una biblioteca de transformaciones predefinidas que representan operaciones de procesamiento de datos comunes y útiles. Estas son transformaciones básicas con funciones de procesamiento genérico ya escritas para ti o transformaciones compuestas que combinan las transformaciones predefinidas simples a fin de ejecutar funciones de procesamiento útiles.

Java

En el SDK de Dataflow para Java, puedes encontrar estas transformaciones en el paquete com.google.cloud.dataflow.sdk.transforms.

Puedes usar cualquiera de las transformaciones predefinidas en los SDK de Dataflow como se encuentran en tu propia canalización. Estas transformaciones son operaciones genéricas y convenientes que pueden realizar pasos de procesamiento de datos comunes, como contar elementos de una colección, dividir una colección en cuantiles, encontrar los elementos N superiores (o inferiores) en una colección y realizar combinaciones matemáticas básicas en datos numéricos.

Muchas de las transformaciones predefinidas en el SDK de Dataflow son transformaciones compuestas genéricas que pueden tomar diferentes tipos de datos. Estas constan de transformaciones básicas anidadas como ParDo, GroupByKey y Combine.

Java

El SDK de Dataflow para Java puede representar las operaciones de procesamiento de datos más comunes con transformaciones básicas. Las transformaciones predefinidas que se proporcionan en los SDK son wrappers preintegrados esenciales para transformaciones genéricas ParDo, Combine, etc. organizadas, de manera que cuenten los elementos o realicen combinaciones matemáticas básicas. Sum.integersGlobally, por ejemplo, agrupa la transformación básica Combine.Globally para los tipos Integer y proporciona una CombineFn predefinida que procesa la suma de todos los elementos de entrada. En lugar de escribir tu propia versión de Combine.Globally con una suma de CombineFn, puedes usar la preintegrada que se proporciona en el SDK.

Si las transformaciones incluidas en los SDK de Dataflow no se adecuan con exactitud al caso práctico de tu canalización, puedes crear tus propias transformaciones compuestas genéricas y reutilizables. El código fuente para las transformaciones incluidas puede servir como modelo a fin de crear de tus propias transformaciones compuestas con ParDo, Combine y otras transformaciones básicas. Si deseas obtener más información, consulta Crea transformaciones compuestas.

Patrones de procesamiento comunes

Las transformaciones incluidas en los SDK de Dataflow proporcionan mecanismos convenientes para realizar operaciones de procesamiento de datos comunes en tus canalizaciones. El código fuente de estas transformaciones ilustra cómo las transformaciones básicas como ParDo se pueden usar (o volver a usar) en varias operaciones.

Wrappers ParDo simples

Algunas de las transformaciones más simples que se proporcionan en los SDK de Dataflow son transformaciones de utilidad para administrar los pares clave/valor. A partir de una PCollection determinada de pares clave/valor, la transformación Keys muestra una PCollection que solo contiene las claves; la transformación Values muestra una PCollection que solo contiene los valores. La transformación KvSwap cambia el elemento clave y el elemento de valor de cada par clave/valor y muestra una PCollection de los pares revertidos.

Java

Keys, Values, KvSwap, MapElements, FlatMapElements, Filter y Partition son transformaciones simples compuestas por un solo ParDo. En cada caso, ParDo invoca un DoFn relativamente simple para producir los elementos de la salida PCollection.

Este es el método apply para la transformación de Clave que acepta una PCollection genérica de elementos KV<K, V> y muestra una PCollection<K> de solo las claves de los pares clave/valor:

  @Override
  public PCollection<K> apply(PCollection<? extends KV<K, ?>> in) {
    return
        in.apply(ParDo.named("Keys")
                 .of(new DoFn<KV<K, ?>, K>() {
                     @Override
                     public void processElement(ProcessContext c) {
                       c.output(c.element().getKey());
                     }
                    }));
  }

En el ejemplo, el método apply aplica una transformación ParDo a la colección de entrada (in). Ese ParDo invoca un DoFn simple para escribir una parte clave del par clave-valor. El DoFn es trivial y se puede definir como una instancia de clase interna anónima.

Patrones que combinan elementos

Los SDK de Dataflow contienen una cantidad de transformaciones convenientes que realizan combinaciones estadísticas y matemáticas comunes en los elementos. Por ejemplo, existen transformaciones que aceptan una PCollection de datos numéricos (como números enteros) y realizan una combinación matemática: encuentran la suma de todos los elementos, el promedio de todos los elementos o el elemento más grande o pequeño de la colección. Los ejemplos de transformaciones de este tipo son Sum y Mean.

Otras trasformaciones realizan análisis estadísticos básicos en una colección: encuentran los elementos N principales, por ejemplo, o presentan una muestra aleatoria de cada elemento N en una PCollection determinada. Los ejemplos de transformaciones de este tipo incluyen Top y Sample.

Java

Estas transformaciones se basan en la transformación básica Combine. Incluyen variantes que funcionan en las PCollections de valores individuales (con Combine.globally) y las PCollections de pares clave-valor (con Combine.perKey).

Consulta la fuente y la documentación de referencia de la API de Java para la transformación Top a fin de obtener un ejemplo de transformación combinada con variantes globales y por clave.

Procesamiento de estilo Map/Shuffle/Reduce

Algunas de las transformaciones incluidas en los SDK de Dataflow realizan procesamientos similares a un algoritmo de estilo Map, Shuffle y Reduce. Estas transformaciones incluyen Count, que acepta una colección de elementos no única y potencial que muestra una colección reducida de solo los elementos únicos sincronizados con un recuento de caso para cada uno. La transformación RemoveDuplicates también reduce una colección no única a solo elementos únicos, pero no proporciona un recuento de caso.

Java

Estas transformaciones usan las transformaciones básicas ParDo y Combine.perKey. Combine.perKey es en sí misma una operación compuesta que realiza un GroupByKey y combina el flujo de valores resultantes para cada clave en un valor único. ParDo representa la fase Map de Map, Shuffle y Reduce; Combine.perKey representa las fases Shuffle y Reduce.

Este es el método apply para la transformación Count que muestran la lógica de procesamiento en las transformaciones anidadas ParDo y Combine.perKey:

  @Override
  public PCollection<KV<T, Long>> apply(PCollection<T> in) {
    return
        in
        .apply(ParDo.named("Init")
               .of(new DoFn<T, KV<T, Long>>() {
                   @Override
                   public void processElement(ProcessContext c) {
                     c.output(KV.of(c.element(), 1L));
                   }
                 }))

        .apply(Combine.<T, Long>perKey(
                 new SerializableFunction<Iterable<Long>, Long>() {
                   @Override
                   public Long apply(Iterable<Long> values) {
                     long sum = 0;
                     for (Long value : values) {
                       sum += value;
                     }
                     return sum;
                   }
                 }));
  }

En el ejemplo, el método apply usa una transformación ParDo a fin de adjuntar un recuento de caso de cada elemento en la PCollection de entrada, lo que crea un par clave-valor de cada elemento: esta es la fase Map de Map, Shuffle y Reduce. Luego, Count aplica una transformación Combine.perKey para realizar la lógica Shuffle y Reduce y produce una PCollection de los elementos únicos con un recuento combinado de los casos.

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Si necesitas ayuda, visita nuestra página de asistencia.