Exemplo de script de ETL do Glue para carregar dados da tabela Tulip
  • 28 Aug 2024
  • 2 Minutos para Ler
  • Contribuintes

Exemplo de script de ETL do Glue para carregar dados da tabela Tulip


Resumo do artigo

Consultar tabelas do Tulip com um script ETL Glue para simplificar a transferência de dados do Tulip para o Redshift (ou outras nuvens de dados)

Objetivo

Esse script fornece um ponto de partida simples para consultar dados em tabelas do Tulip e movê-los para o Redshift ou outros Data Warehouses

Arquitetura de alto nível

Essa arquitetura de alto nível pode ser usada para consultar dados da API Tables do Tulip e, em seguida, salvos no Redshift para análise e processamento adicionais.

image.png

Script de exemplo

O script de exemplo abaixo mostra como consultar uma única tabela do Tulip com o Glue ETL (Python Powershell) e depois gravar no Redshift. OBSERVAÇÃO: para casos de uso de produção em escala, recomenda-se gravar em um bucket temporário do S3 e, em seguida, copiar o conteúdo do bucket para o S3. Além disso, as credenciais são salvas por meio do AWS Secrets Manager.



import sys import pandas as pd import numpy as np import requests import json import boto3 from botocore.exceptions import ClientError from sqlalchemy import create\_engine import sqlalchemy as sa from sqlalchemy.engine.url import URL import psycopg2 from datetime import datetime import logging logger = logging.getLogger()


table\_id = 'aKzvoscgHCyd2CRu3\_DEFAULT' def get\_secret(secret\_name, region\_name): # Criar um cliente do Gerenciador de segredos session = boto3.session.Session() client = session.client( service\_name='secretsmanager', region\_name=region\_name ) try: get\_secret\_value\_response = client.get\_secret\_value( SecretId=secret\_name ) except ClientError as e: # Para obter uma lista das exceções lançadas, consulte # https://docs.aws.amazon.com/secretsmanager/latest/apireference/API\_GetSecretValue.html raise e return json.loads(get\_secret\_value\_response['SecretString'])


redshift\_credentials = get\_secret(secret\_name='tulip\_redshift', region\_name='us-east-1') api\_credentials = get\_secret(secret\_name='[INSTANCE].tulip.co-API-KEY', region\_name='us-east-1')


# Criar mecanismo SQL


url = URL.create( drivername='postgresql', host=redshift\_credentials['host'], port=redshift\_credentials['port'], database=redshift\_credentials['dbname'], username=redshift\_credentials['username'], password=redshift\_credentials['password'] ) engine = sa.create\_engine(url)


header = {'Authorization' : api\_credentials['auth\_header']} base\_url = 'https://william.tulip.co/api/v3'


offset = 0 function = f'/tables/{table\_id}/records?limit=100&offset={offset}&includeTotalCount=false&filterAggregator=all' r = requests.get(base\_url+function, headers=header) df = pd.DataFrame(r.json()) length = len(r.json())


while length > 0: offset += 100 function = f'/tables/{table\_id}/records?limit=100&offset={offset}&includeTotalCount=false&filterAggregator=all' r = requests.get(base\_url+function, headers=header) length = len(r.json()) df\_append = pd.DataFrame(r.json()) df = pd.concat([df, df\_append], axis=0)


# capturar registro de data e hora


now = datetime.now() df['datetime\_updated'] = now


# gravar no Redshift


df.to\_sql('station\_activity\_from\_glue', engine, schema='product\_growth', index=False,if\_exists='replace')


Considerações sobre escala

Considere usar o S3 como um armazenamento temporário intermediário para copiar os dados do S3 para o Redshift em vez de gravá-los diretamente no Redshift. Isso pode ser mais eficiente do ponto de vista computacional.

Além disso, você também pode usar metadados para gravar todas as tabelas Tulip em um Data Warehouse, em vez de tabelas Tulip isoladas

Por fim, esse script de exemplo sobrescreve a tabela inteira a cada vez. Um método mais eficiente seria atualizar as linhas modificadas desde a última atualização ou consulta.

Próximas etapas

Para ler mais, consulte o Amazon Well-Architected Framework. Esse é um ótimo recurso para entender os métodos ideais para fluxos de dados e integrações


Este artigo foi útil?