

# Uso del formato Avro en AWS Glue
<a name="aws-glue-programming-etl-format-avro-home"></a>

AWS Glue recupera datos de fuentes y escribe datos en destinos almacenados y transportados en varios formatos de datos. Si los datos se almacenan o se transportan en formato de datos Avro, este documento presenta las características disponibles para utilizar los datos en AWS Glue.

AWS Glue admite el uso del formato Avro. Este es un formato de datos basado en filas y orientado al rendimiento. Para obtener una introducción al formato por parte de la autoridad de normalización, consulte [Documentación de Apache Avro 1.8.2](https://avro.apache.org/docs/1.8.2/).

Puede utilizar AWS Glue para leer archivos Avro de Amazon S3 y de orígenes de streaming, como también para escribir archivos Avro en Amazon S3. Puede leer y escribir archivos `bzip2` y `gzip` que contengan archivos Avro de S3. Además, puede escribir `deflate`, `snappy` y `xz` archivos que contengan archivos Avro. Debe configurar el comportamiento de compresión en el [Parámetros de conexión S3](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-s3) en lugar de en la configuración que se describe en esta página. 

En la siguiente tabla se muestran las operaciones comunes de AWS Glue que admiten la opción de formato Avro.


| Lectura | Escritura | Lectura de streaming | Grupo de archivos pequeños | Marcadores de trabajo | 
| --- | --- | --- | --- | --- | 
| Compatible | Compatible | Compatible\$1 | No se admite | Compatible | 

\$1Compatible con restricciones. Para obtener más información, consulte [Notas y restricciones para orígenes de streaming de Avro](add-job-streaming.md#streaming-avro-notes).

## Ejemplo: leer archivos o carpetas Avro de S3
<a name="aws-glue-programming-etl-format-avro-read"></a>

**Requisitos previos:** necesitará las rutas de S3 (`s3path`) de las carpetas o los archivos Avro que desee leer. 

**Configuración:** en las opciones de la función, especifique `format="avro"`. En sus `connection_options`, utilice la clave `paths` para especificar `s3path`. Puede configurar la forma en que el lector interactúa con S3 en la `connection_options`. Para obtener más información, consulte Opciones de formato de datos para entradas y salidas de ETL en AWS Glue: [Referencia de opción de conexión de Amazon S3](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-s3). Puede configurar la manera en que el lector interpreta los archivos Avro en sus `format_options`. Para obtener más información, consulte [Referencia de configuración de Avro](#aws-glue-programming-etl-format-avro-reference).

El siguiente script de ETL de AWS Glue muestra el proceso de lectura de archivos o carpetas Avro de S3: 

------
#### [ Python ]

Para este ejemplo, use el método [create\$1dynamic\$1frame.from\$1options](aws-glue-api-crawler-pyspark-extensions-glue-context.md#aws-glue-api-crawler-pyspark-extensions-glue-context-create_dynamic_frame_from_options).

```
from pyspark.context import SparkContext
from awsglue.context import GlueContext

sc = SparkContext.getOrCreate()
glueContext = GlueContext(sc)

dynamicFrame = glueContext.create_dynamic_frame.from_options(
    connection_type="s3",
    connection_options={"paths": ["s3://s3path"]},
    format="avro"
)
```

------
#### [ Scala ]

Para este ejemplo, use la operación [getSourceWithFormat](glue-etl-scala-apis-glue-gluecontext.md#glue-etl-scala-apis-glue-gluecontext-defs-getSourceWithFormat).

```
import com.amazonaws.services.glue.util.JsonOptions
import com.amazonaws.services.glue.GlueContext
import org.apache.spark.sql.SparkContext

object GlueApp {
  def main(sysArgs: Array[String]): Unit = {
    val spark: SparkContext = new SparkContext()
    val glueContext: GlueContext = new GlueContext(spark)

    val dynamicFrame = glueContext.getSourceWithFormat(
      connectionType="s3",
      format="avro",
      options=JsonOptions("""{"paths": ["s3://s3path"]}""")
    ).getDynamicFrame()
  }
```

------

## Ejemplo: escribir archivos y carpetas Avro en S3
<a name="aws-glue-programming-etl-format-avro-write"></a>

**Requisitos previos:** necesitará un DataFrame inicializado (`dataFrame`) o DynamicFrame (`dynamicFrame`). También necesitará la ruta de salida S3 prevista, `s3path`. 

**Configuración:** en las opciones de la función, especifique `format="avro"`. En sus `connection_options`, utilice la clave `paths` para especificar su `s3path`. Puede modificar aún más la forma en que el escritor interactúa con S3 en las `connection_options`. Para obtener más información, consulte Opciones de formato de datos para entradas y salidas de ETL en AWS Glue: [Referencia de opción de conexión de Amazon S3](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-s3). Puede alterar la manera en que el escritor interpreta los archivos Avro en sus `format_options`. Para obtener más información, consulte [Referencia de configuración de Avro](#aws-glue-programming-etl-format-avro-reference). 

El siguiente script de ETL de AWS Glue muestra el proceso de escritura de archivos o carpetas Avro en S3.

------
#### [ Python ]

Para este ejemplo, use el método [write\$1dynamic\$1frame.from\$1options](aws-glue-api-crawler-pyspark-extensions-glue-context.md#aws-glue-api-crawler-pyspark-extensions-glue-context-write_dynamic_frame_from_options).

```
from pyspark.context import SparkContext
from awsglue.context import GlueContext

sc = SparkContext.getOrCreate()
glueContext = GlueContext(sc)

glueContext.write_dynamic_frame.from_options(
    frame=dynamicFrame,
    connection_type="s3",
    format="avro",
    connection_options={
        "path": "s3://s3path"
    }
)
```

------
#### [ Scala ]

Para este ejemplo, use el método [getSinkWithFormat](glue-etl-scala-apis-glue-gluecontext.md#glue-etl-scala-apis-glue-gluecontext-defs-getSinkWithFormat).

```
import com.amazonaws.services.glue.util.JsonOptions
import com.amazonaws.services.glue.{DynamicFrame, GlueContext}
import org.apache.spark.SparkContext

object GlueApp {
  def main(sysArgs: Array[String]): Unit = {
    val spark: SparkContext = new SparkContext()
    val glueContext: GlueContext = new GlueContext(spark)

    glueContext.getSinkWithFormat(
      connectionType="s3",
      options=JsonOptions("""{"path": "s3://s3path"}"""),
      format="avro"
    ).writeDynamicFrame(dynamicFrame)
  }
}
```

------

## Referencia de configuración de Avro
<a name="aws-glue-programming-etl-format-avro-reference"></a>

Puede utilizar los siguientes valores `format_options` donde las bibliotecas de AWS Glue especifiquen `format="avro"`:
+ `version`: especifica la versión del formato lector/escritor Apache Avro que se va a soportar. El valor predeterminado es 1.7. Puede especificar `format_options={"version": “1.8”}` para habilitar el tipo de lectura y escritura lógico de Avro. Para obtener más información, consulte la [especificación de Apache Avro 1.7.7](https://avro.apache.org/docs/1.7.7/spec.html) y la [especificación de Apache Avro 1.8.2](https://avro.apache.org/docs/1.8.2/spec.html).

  El conector de Apache Avro 1.8 admite las siguientes conversiones de tipo lógico:

Para el lector: en esta tabla, se muestra la conversión entre el tipo de datos de Avro (tipo lógico y tipo primitivo de Avro) y el tipo de datos `DynamicFrame` de AWS Glue para las versiones 1.7 y 1.8 del lector de Avro.


| Tipo de datos de Avro: Tipo lógico | Tipo de datos de Avro: Tipo primitivo de Avro | Tipo de datos DynamicFrame de Glue:Lector 1.7 de Avro | Tipo de datos DynamicFrame de Glue: Lector 1.8 de Avro | 
| --- | --- | --- | --- | 
| Decimal | bytes | BINARIO | Decimal | 
| Decimal | fijo | BINARIO | Decimal | 
| Date | int | INT | Date | 
| Tiempo (milisegundos) | int | INT | INT | 
| Tiempo (microsegundos) | long | LONG | LONG | 
| Marca de tiempo (milisegundos) | long | LONG | Timestamp | 
| Marca de tiempo (microsegundos) | long | LONG | LONG | 
| Duración (no es un tipo lógico) | fijo de 12 | BINARIO | BINARIO | 

Para el escritor: en esta tabla, se muestra la conversión entre el tipo de datos `DynamicFrame` de AWS Glue y el tipo de datos de Avro para las versiones 1.7 y 1.8 del escritor de Avro.


| Tipo de datos `DynamicFrame` de AWS Glue | Tipo de datos de Avro:Escritor 1.7 de Avro | Tipo de datos de Avro:Escritor 1.8 de Avro | 
| --- | --- | --- | 
| Decimal | Cadena | decimal | 
| Date | Cadena | date | 
| Timestamp | Cadena | marca temporal (microsegundos) | 

## Compatibilidad entre Avro y Spark DataFrame
<a name="aws-glueprogramming-etl-format-avro-dataframe-support"></a>

Para utilizar Avro desde la API de Spark DataFrame, debe instalar el complemento Spark Avro para la versión de Spark correspondiente. La versión de Spark disponible en su trabajo está determinada por la versión de AWS Glue. Para obtener más información acerca de las versiones de Spark, consulte [AWS GlueVersiones de](release-notes.md). Apache mantiene este complemento; nosotros no ofrecemos garantías específicas de compatibilidad.

En AWS Glue 2.0 se utiliza la versión 2.4.3 del complemento Spark Avro. Puede encontrar este JAR en Maven Central, consulte [org.apache.spark:spark-avro\$12.12:2.4.3](https://search.maven.org/artifact/org.apache.spark/spark-avro_2.12/3.1.1/jar).

En AWS Glue 3.0 se utiliza la versión 3.1.1 del complemento Spark Avro. Puede encontrar este JAR en Maven Central, consulte [org.apache.spark:spark-avro\$12.12:3.1.1](https://search.maven.org/artifact/org.apache.spark/spark-avro_2.12/3.1.1/jar).

Para incluir archivos JAR adicionales en un trabajo de ETL de AWS Glue, utilice el parámetro de trabajo `--extra-jars`. Para obtener más información acerca de la configuración de parámetros de trabajos, consulte [Uso de los parámetros de trabajo en los trabajos de AWS Glue](aws-glue-programming-etl-glue-arguments.md). También puede configurar este parámetro en la Consola de administración de AWS.