

# Etapa 2. Implemente a lógica da transformação
<a name="custom-visual-transform-implementation"></a>

**nota**  
 As transformações visuais personalizadas são compatíveis apenas scripts Python. O Scala não é compatível. 

 Para adicionar o código que implementa a função definida pelo arquivo de configuração .json, é recomendável colocar o arquivo Python no mesmo local do arquivo .json, com o mesmo nome, mas com a extensão “.py”. O AWS Glue Studioemparelha automaticamente os arquivos .json e .py para que você não precise especificar o caminho do arquivo Python no arquivo de configuração. 

 No arquivo Python, adicione a função declarada, com os parâmetros nomeados configurados e registre-a para ser usada no `DynamicFrame`. Este é um exemplo de um arquivo Python: 

```
from awsglue import DynamicFrame

# self refers to the DynamicFrame to transform, 
# the parameter names must match the ones defined in the config
# if it's optional, need to provide a default value
def myTransform(self, email, phone, age=None, gender="", 
                      country="", promotion=False):
   resulting_dynf = # do some transformation on self 
   return resulting_dynf
   
DynamicFrame.myTransform = myTransform
```

 É recomendável usar um caderno AWS Glue para obter a maneira mais rápida de desenvolver e testar o código python. Consulte [Conceitos básicos de cadernos no AWS Glue Studio](https://docs.aws.amazon.com/glue/latest/ug/notebook-getting-started.html). 

 Para ilustrar como implementar a lógica de transformação, a transformação visual personalizada no exemplo abaixo é uma transformação para filtrar os dados recebidos para manter somente os dados relacionados a um estado específico dos EUA. O arquivo .json contém o parâmetro para `functionName` como `custom_filter_state` e dois argumentos (“state” e “colName” com o tipo “str”). 

 O exemplo de arquivo config .json é: 

```
{
"name": "custom_filter_state",
"displayName": "Filter State",
"description": "A simple example to filter the data to keep only the state indicated.",
"functionName": "custom_filter_state",
"parameters": [
   {
    "name": "colName",
    "displayName": "Column name",
    "type": "str",
    "description": "Name of the column in the data that holds the state postal code"
   },
   {
    "name": "state",
    "displayName": "State postal code",
    "type": "str",
    "description": "The postal code of the state whole rows to keep"
   }   
  ]
}
```

**Para implementar o script complementar no Python**

1.  Inicie um caderno do AWS Glue e execute a célula inicial fornecida para o início da sessão. A execução da célula inicial cria os componentes básicos necessários. 

1.  Crie uma função que execute a filtragem conforme descrito no exemplo e registre-a no `DynamicFrame`. Copie o código abaixo e cole em uma célula do caderno do AWS Glue. 

   ```
   from awsglue import DynamicFrame
   
   def custom_filter_state(self, colName, state):
       return self.filter(lambda row: row[colName] == state)
   
   DynamicFrame.custom_filter_state = custom_filter_state
   ```

1.  Crie ou carregue dados de amostra para testar o código na mesma célula ou em uma nova célula. Se você adicionar os dados de exemplo em uma nova célula, não se esqueça de executar a célula. Por exemplo: 

   ```
   # A few of rows of sample data to test
   data_sample = [
       {"state": "CA", "count": 4},
       {"state": "NY", "count": 2},
       {"state": "WA", "count": 3}    
   ]
   df1 = glueContext.sparkSession.sparkContext.parallelize(data_sample).toDF()
   dynf1 = DynamicFrame.fromDF(df1, glueContext, None)
   ```

1.  Teste para validar o "custom\$1filter\$1state" com argumentos diferentes:   
![\[A captura de tela mostra uma célula em um caderno do AWS Glue com os argumentos passados para a função DynamicFrame.show.\]](http://docs.aws.amazon.com/pt_br/glue/latest/dg/images/dynamic-transform-notebook-test-python.png)

1.  Depois de executar vários testes, salve o código com a extensão .py e nomeie o arquivo .py com um nome que espelhe o nome do arquivo .json. Os arquivos.py e .json devem estar na mesma pasta de transformação. 

    Copie o código a seguir e cole-o em um arquivo e renomeie-o com uma extensão de arquivo .py. 

   ```
   from awsglue import DynamicFrame
   
   def custom_filter_state(self, colName, state):
       return self.filter(lambda row: row[colName] == state)
   
   DynamicFrame.custom_filter_state = custom_filter_state
   ```

1.  No AWS Glue Studio, abra uma tarefa visual e adicione a transformação à tarefa selecionando-a na lista de **Transformações** disponíveis. 

    Para reutilizar essa transformação em um código de script Python, adicione o caminho do Amazon S3 ao arquivo .py nno trabalho, em “Referenced files path” (Caminho de arquivos referenciados) e, no script, importe o nome do arquivo python (sem a extensão) adicionando-o à parte superior do arquivo. Por exemplo: `import` <nome do arquivo (sem a extensão)> 