E/S de Avro

Las transformaciones integradas Read y Write para los archivos Avro se incluyen en AvroIO. Puedes usar AvroIO si deseas leer y escribir archivos locales (es decir, archivos en el sistema donde se ejecuta tu programa de Java) y archivos remotos en Google Cloud Storage.

Java

Nota: Si deseas que tu canalización lea o escriba archivos locales, deberás usar DirectPipelineRunner para ejecutar tu canalización de manera local. Esto se debe a que las instancias de Google Compute Engine que usa el servicio de Dataflow a fin de ejecutar tu canalización no podrán acceder a los archivos en tu máquina local para la lectura y escritura.

Especifica un esquema Avro

Si deseas usar AvroIO, tendrás que especificar un esquema Avro que describa los registros para leer o escribir. Avro se basa en esquemas para describir cómo se serializan los datos. Consulta la documentación de Avro para conocer cómo funcionan los esquemas Avro.

Puedes leer tipos de registros de Avro específicos si proporcionas un tipo de clase generado de Avro o puedes leer GenericRecords si proporcionas un objeto org.apache.avro.Schema. Por lo general, leerás el objeto Schema desde un archivo de esquema (.avsc). También puedes especificar un Schema en formato de string codificada en JSON.

Para proporcionar un esquema, usa el método .withSchema con la transformación AvroIO. Debes llamar a .withSchema cada vez que uses AvroIO.Read o AvroIO.Write.

Lee con AvroIO

La transformación AvroIO.Read lee los registros de uno o más archivos Avro y crea una PCollection en la que cada elemento representa un registro. AvroIO.Read puede producir una PCollection de objetos de clase de Avro generados de forma automática o de objetos GenericRecord. El tipo de PCollection producida depende del tipo de esquema que elijas.

Usar una clase de Avro generada de forma automática resultará en una PCollection cuyos elementos son objetos de ese tipo de clase Avro, como se muestra a continuación:

Java

  PipelineOptions options = PipelineOptionsFactory.create();
  Pipeline p = Pipeline.create(options);

  PCollection<AvroAutoGenClass> records = p.apply(
    AvroIO.Read.named("ReadFromAvro")
          .from("gs://some/inputData.avro")
          .withSchema(AvroAutoGenClass.class));

Para leer tus archivos Avro en una PCollection<GenericRecord>, puedes pasar un objeto org.apache.avro.Schema o un esquema escrito como una string codificada en JSON. En el siguiente código de ejemplo, se obtiene un objeto org.apache.avro.Schema mediante el análisis de un archivo .avsc. Luego se usa un Schema resultante para leer los archivos Avro de entrada fragmentados desde Google Cloud Storage:

Java

  PipelineOptions options = PipelineOptionsFactory.create();
  Pipeline p = Pipeline.create(options);

  Schema schema = new Schema.Parser().parse(new File("schema.avsc"));

  PCollection<GenericRecord> records =
    p.apply(AvroIO.Read.named("ReadFromAvro")
                       .from("gs://my_bucket/path/records-*.avro")
                       .withSchema(schema));

Al igual que con otras fuentes de Dataflow basadas en archivos, la transformación AvroIO.Read puede leer varios archivos de entrada. Para obtener más información sobre cómo controlar varios archivos cuando se lee desde las fuentes basadas en archivos, consulta Lee datos de entrada.

Escribe con AvroIO

La transformación AvroIO.Write escribe una PCollection de registros Avro en uno o más archivos Avro. Para usar AvroIO.Write, deberás representar tus datos de salida finales como una PCollection de los objetos de clase generados de Avro de forma automática o una PCollection de GenericRecords. Puedes usar un ParDo para transformar tus datos de manera adecuada.

Para escribir archivos específicos, usa una clase de Avro generada de forma automática como el esquema Avro:

Java

  PCollection<AvroAutoGenClass> filteredRecords = ...;
  filteredRecords.apply(AvroIO.Write.named("WriteToAvro")
                                    .to("gs://some/outputData.avro")
                                    .withSchema(AvroAutoGenClass.class)
                                    .withSuffix(".avro"));

Para escribir objetos GenericRecord, puedes pasar un org.apache.avro.Schema (a menudo mediante el análisis de un archivo .avsc) o un esquema escrito como una string codificada en JSON. En el siguiente ejemplo de código, se analiza un archivo .avsc a fin de obtener un objeto Schema. Este se usa para escribir archivos Avro de salida fragmentados en Google Cloud Storage:

Java

  Schema schema = new Schema.Parser().parse(new File("schema.avsc"));

  PCollection<GenericRecord> records = ...;
  records.apply(AvroIO.Write.named("WriteToAvro")
                            .to("gs://my_bucket/path/numbers")
                            .withSchema(schema)
                            .withSuffix(".avro"));

Ten en cuenta que AvroIO.Write escribe a varios archivos de salida de forma predeterminada. Para obtener información adicional, consulta Escribe datos de salida.

¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…

¿Necesitas ayuda? Visita nuestra página de asistencia.