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.
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
-
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.
-
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
-
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)
-
Teste para validar o "custom_filter_state" com argumentos diferentes:
-
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
-
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)>