# Avro File Writer

{% hint style="info" %}
O **Avro File Writer** é um conector exclusivo do Pipeline Engine v2.
{% endhint %}

O conector **Avro File Writer** permite que você escreva arquivos Avro com base em *schemas* Avro.

Avro é um *framework* para serialização de dados utilizado no ecossistema Hadoop Big Data, conhecido por seu suporte à evolução de *schema* e compactação. Para mais informações, [veja o site oficial](https://avro.apache.org/).

## **Parâmetros**

Dê uma olhada nos parâmetros de configuração do conector. Parâmetros suportados por [expressões Double Braces](https://docs.digibee.com/documentation/connectors-and-triggers/pt-br/double-braces/overview) estão marcados com `(DB)`.

### **Aba General**

<table data-full-width="true"><thead><tr><th>Parâmetro</th><th>Descrição</th><th>Valor padrão</th><th>Tipo de dado</th></tr></thead><tbody><tr><td><strong>File Name</strong> <code>(DB)</code></td><td>Nome do arquivo Avro a ser escrito.</td><td>file.avro</td><td><em>String</em></td></tr><tr><td><strong>Data</strong> <code>(DB)</code></td><td><p>Dados a serem escritos no arquivo Avro.</p><p>Aceita apenas objetos e <em>arrays</em> de objetos JSON.</p></td><td>{{ message.data }}</td><td><em>String</em></td></tr><tr><td><strong>Schema</strong> <code>(DB)</code></td><td><p>O <em>schema</em> Avro a ser utilizado na escrita do arquivo.</p><p>Aceita apenas <em>schemas</em> com o tipo <code>RECORD</code> como tipo de dado raiz.</p></td><td>N/A</td><td><em>String</em></td></tr><tr><td><strong>Data From File</strong></td><td>Se o parâmetro estiver ativado, os dados a serem escritos no arquivo Avro devem ser informados através de outros arquivos Avro e não via <em>payload</em> JSON.</td><td><em>False</em></td><td>Booleano</td></tr><tr><td><strong>Files</strong></td><td><p>Define os arquivos Avro contendo os dados a serem escritos no arquivo Avro final.</p><p></p><p>Essa opção só está disponível quando <strong>Data From File</strong> estiver ativado.</p></td><td>N/A</td><td>Opções de <em>Data From File</em></td></tr><tr><td><strong>File Name</strong> <code>(DB)</code></td><td><p>Nome do arquivo Avro contendo os dados.</p><p></p><p>Essa opção só está disponível quando <strong>Data From File</strong> for habilitado.</p></td><td>N/A</td><td><em>String</em></td></tr><tr><td><strong>Infer Schema From File</strong></td><td>Se o parâmetro estiver ativado, o <em>schema</em> Avro será inferido do primeiro arquivo Avro definido no parâmetro <strong>Files</strong>.</td><td><em>False</em></td><td>Booleano</td></tr><tr><td><strong>File Exists Policy</strong></td><td><p>Define qual comportamento a ser seguido quando um arquivo de mesmo nome (<strong>File Name</strong>) já existir na execução vigente do <em>pipeline</em>.</p><p>Você pode escolher as seguintes opções: <strong>Append</strong> (o arquivo existente é complementado com os dados), <strong>Overwrite</strong> (sobrescreve o arquivo existente) ou <strong>Fail</strong> (a execução é interrompida com um erro se o arquivo já existir).</p></td><td><em>Append</em></td><td><em>String</em></td></tr><tr><td><strong>Fail On Error</strong></td><td>Se a opção estiver ativada, a execução do <em>pipeline</em> com erro será interrompida. Do contrário, a execução do <em>pipeline</em> continua, mas o resultado irá mostrar um valor falso para a propriedade <code>"success"</code>.</td><td><em>False</em></td><td>Booleano</td></tr></tbody></table>

### **Aba Advanced**

<table data-full-width="true"><thead><tr><th>Parâmetro</th><th>Descrição</th><th>Valor padrão</th><th>Tipo de dado</th></tr></thead><tbody><tr><td><strong>Compression Codec</strong></td><td><p>O <em>codec</em> de compressão a ser utilizado ao comprimir o arquivo Avro.</p><p>Opções:</p><ul><li><strong>Uncompressed</strong></li><li><strong>DEFLATE</strong></li><li><strong>BZIP2</strong></li></ul></td><td><em>Uncompressed</em></td><td><em>String</em></td></tr><tr><td><strong>Compression Level</strong></td><td><p>O nível de compressão a ser aplicado ao comprimir o arquivo Avro. Opções: 1-9</p><p>Essa opção só está disponível quando <strong>Compression Codec</strong> for configurado como <strong>DEFLATE.</strong></p></td><td>1</td><td>Inteiro</td></tr></tbody></table>

### **Aba Documentação**

<table data-full-width="true"><thead><tr><th>Parâmetro</th><th>Descrição</th><th>Valor padrão</th><th>Tipo de dado</th></tr></thead><tbody><tr><td><strong>Documentation</strong></td><td>Seção para documentar qualquer informação necessária sobre a configuração do conector e regras de negócio.</td><td>N/A</td><td><em>String</em></td></tr></tbody></table>

{% hint style="info" %}
Note que podem ocorrer diferenças de performance ao escrever arquivos Avro comprimidos e não comprimidos. Como a compressão exige um maior consumo de memória e processamento, é importante validar os limites que o *pipeline* irá suportar ao aplicá-la.
{% endhint %}

## **Exemplos de uso**

### **Arquivo a partir de um objeto JSON**

Escrevendo um arquivo Avro a partir de um objeto JSON como *payload*:

* **File Name:** file.avro
* **Data:** {{ message.data }}
* **Schema:** {{ message.schema }}
* **File Exists Policy:** *Overwrite*
* **Compression Codec:** *Uncompressed*

**Dados de exemplo:**

```
{
  "data": {
    "name": "Aquiles",
    "phoneNumbers": [
      "11 99999-9999",
      "11 93333-3333"
    ],
    "active": true,
    "address": "St. Example",
    "score": 71.3,
    "details": "Some details"
  }
}

```

**Schema de exemplo:**

```
{
  "schema": {
    "type": "record",
    "name": "Record",
    "fields": [
        {
            "name": "name",
            "type": "string"
        },
        {
            "name": "phoneNumbers",
            "type": {
                "type": "array",
                "items": "string"
            }
        },
        {
            "name": "active",
            "type": "boolean"
        },
        {
            "name": "address",
            "type": "string"
        },
        {
            "name": "score",
            "type": "double"
        },
        {
            "name": "details",
            "type": [
                "string",
                "null"
            ]
        }
    ]
  }
}

```

**Saída:**

```
{
  "success": true,
  "fileName": "file.avro"
}

```

### **Arquivo a partir de um array de objetos JSON**

Escrevendo um arquivo Avro a partir de um *array* de objetos JSON como *payload*:

* **File Name:** file.avro
* **Data:** {{ message.data }}
* **Schema:** {{ message.schema }}
* **File Exists Policy:** *Overwrite*

**Dados de exemplo:**

```
{
  "data": [ 
    {
      "name": "Aquiles",
      "phoneNumbers": [
        "11 99999-9999",
        "11 93333-3333"
      ],
      "active": true,
      "address": "St. Example",
      "score": 71.3,
      "details": "Some details"
    },
    {
      "name": "Vitor",
      "phoneNumbers": [
        "11 97777-7777"
      ],
      "active": false,
      "address": "St. Example 2",
      "score": 80.0,
      "details": null
    }
  ]
}

```

**Schema de exemplo:**

```
{
  "schema": {
    "type": "record",
    "name": "Record",
    "fields": [
        {
            "name": "name",
            "type": "string"
        },
        {
            "name": "phoneNumbers",
            "type": {
                "type": "array",
                "items": "string"
            }
        },
        {
            "name": "active",
            "type": "boolean"
        },
        {
            "name": "address",
            "type": "string"
        },
        {
            "name": "score",
            "type": "double"
        },
        {
            "name": "details",
            "type": [
                "string",
                "null"
            ]
        }
    ]
  }
}

```

**Saída:**

```
{
  "success": true,
  "fileName": "file.avro"
}

```

### **Arquivo Avro não comprimido**

Escrevendo um arquivo Avro não comprimido:

* **File Name:** file.avro
* **Data:** {{ message.data }}
* **Schema:** {{ message.schema }}
* **File Exists Policy:** *Overwrite*
* **Compression Codec:** *Uncompressed*

**Saída:**

```
{
  "success": true,
  "fileName": "file.avro"
}

```

### **Arquivo Avro comprimido**

Escrevendo um arquivo Avro comprimido:

* **File Name:** file.avro
* **Data:** {{ message.data }}
* **Schema:** {{ message.schema }}
* **File Exists Policy:** *Overwrite*
* **Compression Codec:** BZIP2

**Saída:**

```
{
  "success": true,
  "fileName": "file.avro"
}

```

### **File Exists Policy como Fail**

Escrevendo um arquivo Avro com o mesmo nome de um arquivo já existente no diretório de arquivos do *pipeline*:

* F**ile Name:** file.avro
* **Data:** {{ message.data }}
* **Schema:** {{ message.schema }}
* **File Exists Policy:** *Fail*

**Saída:**

{% code overflow="wrap" %}

```
{
  "success": false,
  "message": "Something went wrong while trying to execute the Avro Writer connector",
  "error": "com.digibee.pipelineengine.exception.PipelineEngineRuntimeException: Avro file file.avro already exists."
}

```

{% endcode %}

### **Escrevendo arquivo a partir de outro arquivo Avro - schema explícito**

Escrevendo um arquivo Avro com dados vindo de outro arquivo Avro ao invés de um *payload* JSON, usando uma configuração de *schema* explícita:

* **File Name:** file.avro
* **Data From File:** ativado
* **Files:**
  * **File Name:** {{ message.existingAvroFile }}
* **Schema:** {{ message.schema }}
* **File Exists Policy:** *Overwrite*

**Saída:**

```
{
  "success": true,
  "fileName": "file.avro"
}

```

### **Escrevendo arquivo a partir de outro arquivo Avro - inferindo schema**

Escrevendo um arquivo Avro com dados vindo de outro arquivo Avro ao invés de um *payload* JSON, inferindo o *schema* através do arquivo:

* **File Name:** file.avro
* **Data From File:** ativado
* **Files:**
  * **File Name:** {{ message.existingAvroFile }}
* **Infer Schema:** ativado
* **File Exists Policy:** *Overwrite*

**Saída:**

```
{
  "success": true,
  "fileName": "file.avro"
}

```
