

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

O AWS Glue recupera dados de fontes e grava dados em destinos armazenados e transportados em vários formatos de dados. Se seus dados forem armazenados ou transportados no formato de dados Avro, o documento apresenta os recursos disponíveis para usar seus dados no AWS Glue.

O AWS Glue é compatível com o uso do formato Avro. Esse é um formato de dados orientado a performance e baseado em linhas. Para uma apresentação do formato feita pela autoridade padrão, consulte [a documentação do Apache Avro 1.8.2](https://avro.apache.org/docs/1.8.2/).

Você pode usar o AWS Glue para ler arquivos Avro do Amazon S3 e de fontes de transmissão, bem como para gravar arquivos Avro no Amazon S3. Você pode ler e gravar arquivos `bzip2` e `gzip` do S3 que contenham arquivos Avro. Além disso, você pode gravar arquivamentos `deflate`, `snappy` e `xz` contendo arquivos Avro. Você configura o comportamento de compactação no [Parâmetros de conexão do S3](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-s3) e não na configuração apresentada nesta página. 

A tabela a seguir mostra quais são as operações comuns do AWS Glue compatíveis com a opção de formato Avro.


| Leitura | Escrever | Leitura de transmissão | Agrupar arquivos pequenos | Marcadores de trabalho | 
| --- | --- | --- | --- | --- | 
| Compatível | Compatível | Compatível\$1 | Sem compatibilidade | Compatível | 

\$1Compatível, com restrições. Para obter mais informações, consulte [Notas e restrições para fontes de transmissão Avro](add-job-streaming.md#streaming-avro-notes).

## Exemplo: ler arquivos ou pastas Avro do S3
<a name="aws-glue-programming-etl-format-avro-read"></a>

**Pré-requisitos:** você precisará dos caminhos do S3 (`s3path`) para os arquivos ou pastas Avro que deseja ler. 

**Configuração:** nas opções da sua função, especifique `format="avro"`. Em seu `connection_options`, use a chave `paths` para especificar `s3path`. Você pode configurar como o leitor interage com o S3 no `connection_options`. Para obter detalhes, consulte Opções de formato de dados para entradas e saídas de ETL no AWSGlue: [Referência de opções de conexão do Amazon S3](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-s3). Você pode configurar como o leitor interpreta os arquivos Avro em seu `format_options`. Para obter mais detalhes, consulte [Avro Configuration Reference](#aws-glue-programming-etl-format-avro-reference) (Referência de configuração de Avro).

O seguinte script de ETL do AWS Glue mostra o processo de leitura de arquivos ou pastas Avro provenientes do S3: 

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

Neste exemplo, use o 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 ]

Neste exemplo, use a operação [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()
  }
```

------

## Exemplo: gravar arquivos e pastas Avro no S3
<a name="aws-glue-programming-etl-format-avro-write"></a>

**Pré-requisitos:** você precisará de um DataFrame (`dataFrame`) ou de um DynamicFrame (`dynamicFrame`) inicializado. Você também precisará do caminho de saída esperado do S3, `s3path`. 

**Configuração:** nas opções da sua função, especifique `format="avro"`. Em seu `connection_options`, use a chave `paths` para especificar seu `s3path`. Em `connection_options`, você pode alterar ainda mais a forma como o gravador interage com o S3. Para obter detalhes, consulte Opções de formato de dados para entradas e saídas de ETL no AWSGlue: [Referência de opções de conexão do Amazon S3](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-s3). Você pode alterar a forma como o gravador interpreta os arquivos Avro em `format_options`. Para obter mais detalhes, consulte [Avro Configuration Reference](#aws-glue-programming-etl-format-avro-reference) (Referência de configuração de Avro). 

O seguinte script de ETL do AWS Glue mostra o processo de gravação de arquivos ou pastas Avro no S3.

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

Neste exemplo, use o 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 ]

Neste exemplo, use o 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)
  }
}
```

------

## Referência de configuração de Avro
<a name="aws-glue-programming-etl-format-avro-reference"></a>

Você pode usar os seguinte valores de `format_options` sempre que as bibliotecas do AWS Glue especificarem `format="avro"`:
+ `version`: especifica a versão do formato de leitor/gravador Apache Avro a ser suportada. O padrão é “1.7”. É possível especificar `format_options={"version": “1.8”}` para habilitar a leitura e gravação do tipo lógico Avro. Para obter mais informações, consulte a [Especificação do Apache Avro 1.7.7](https://avro.apache.org/docs/1.7.7/spec.html) e a [Especificação do Apache Avro 1.8.2](https://avro.apache.org/docs/1.8.2/spec.html).

  O conector do Apache Avro 1.8 oferece suporte para os seguintes tipos de conversão:

Para o leitor: esta tabela mostra a conversão entre o tipo de dados Avro (tipo lógico e o tipo primitivo Avro) e o tipo de dados `DynamicFrame` do AWS Glue para o leitor Avro 1.7 e 1.8.


| Tipo de dados Avro: Tipo lógico | Tipo de dados Avro: Tipo primitivo Avro | Tipo de dados GlueDynamicFrame:Leitor Avro 1.7 | Tipo de dados GlueDynamicFrame: Leitor Avro 1.8 | 
| --- | --- | --- | --- | 
| Decimal | bytes | BINARY | Decimal | 
| Decimal | fixo | BINARY | Decimal | 
| Data | int | INT | Data | 
| Tempo (milissegundo) | int | INT | INT | 
| Tempo (microssegundo) | longo | LONG | LONG | 
| Time stamp (milissegundo) | longo | LONG | Timestamp | 
| Time stamp (microssegundo) | longo | LONG | LONG | 
| Duração (não é um tipo lógico) | fixo de 12 | BINARY | BINARY | 

Para o gravador: esta tabela mostra a conversão entre o tipo de dados `DynamicFrame` do AWS Glue e o tipo de dados Avro para o gravador Avro 1.7 e 1.8.


| Tipo de dados do `DynamicFrame` do AWS Glue | Tipo de dados Avro:Gravador Avro 1.7 | Tipo de dados Avro:Gravador Avro 1.8 | 
| --- | --- | --- | 
| Decimal | String | decimal | 
| Data | String | date | 
| Marca de data e hora | String | timestamp-micros | 

## Suporte para Avro Spark DataFrame
<a name="aws-glueprogramming-etl-format-avro-dataframe-support"></a>

Para usar o Avro da API Spark DataFrame, é necessário instalar o plugin Spark Avro para a versão correspondente do Spark. A versão do Spark disponível em seu trabalho é determinada pela versão do AWS Glue. Para obter mais informações sobre as versões do Spark, consulte [AWS GlueVersões do](release-notes.md). O plugin é mantido pelo Apache. Não oferecemos garantias específicas de suporte.

No AWS Glue 2.0: use a versão 2.4.3 do plugin do Spark Avro. Você encontra esse JAR no 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).

No AWS Glue 3.0: use a versão 3.1.1 do plugin do Spark Avro. Você encontra esse JAR no 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 JARs adicionais em um trabalho de ETL do AWS Glue, use o parâmetro de trabalho `--extra-jars`. Para obter mais informações sobre parâmetros de trabalho, consulte [Usar parâmetros de tarefa em tarefas do AWS Glue](aws-glue-programming-etl-glue-arguments.md). Também é possível configurar esse parâmetro no Console de gerenciamento da AWS.