Ler uma API REST
Depois de registrar um ConnectionType API REST e criar uma conexão do AWS Glue, é possível ler os dados da API REST nos trabalhos de ETL do AWS Glue. Com essa conexão, você pode processar dados externos da API REST junto com outras fontes no mesmo trabalho. Você precisa do nome da conexão e do nome da entidade para ler os dados.
O seguinte exemplo mostra como ler uma fonte de dados API REST usando Python:
rest_read = glueContext.create_dynamic_frame.from_options( connection_type="rest", connection_options={ "connectionName": "connection-name", "ENTITY_NAME": "entity-name", "CONNECTION_TYPE": "REST-connection-type" } )
Como filtrar dados
Você pode enviar predicados de filtro para a API REST de origem para reduzir a quantidade de dados transferidos. O conector da API REST é compatível com dois modos de filtro:
QUERY_PARAMS: cada filtro se torna um parâmetro de consulta de URL separado. Por exemplo:
?created[gte]=1704067200&created[lte]=1717200000FILTER_STRING: todos os filtros se combinam em um único parâmetro de consulta. Por exemplo:
?search=status eq "ACTIVE" and lastUpdated gt "2024-01-01"
Para aplicar um predicado de filtro no trabalho de ETL do AWS Glue, use a opção de conexão FILTER_PREDICATE:
rest_read = glueContext.create_dynamic_frame.from_options( connection_type="rest", connection_options={ "connectionName": "connection-name", "ENTITY_NAME": "entity-name", "CONNECTION_TYPE": "REST-connection-type", "FILTER_PREDICATE": "status = \"ACTIVE\" AND lastUpdated >= \"2024-01-01T00:00:00.000Z\"" } )
Propriedades de FilterConfiguration
Configure o comportamento de filtragem no registro de ConnectionType usando o objeto FilterConfiguration. A seguinte tabela descreve as propriedades disponíveis:
Propriedade |
Tipo |
Descrição |
|---|---|---|
|
String |
Obrigatório. |
|
Mapa |
Mapeia operadores lógicos para a sintaxe específica da API. |
|
String |
Padrão de formato DateTime ou |
|
Booleano |
Especifica se as aspas em torno dos valores de entrada devem ou não ser retiradas. Padrão: |
|
Objeto |
Configuração de tratamento de BETWEEN padrão. |
|
Objeto |
Configurações específicas do modo |
Propriedades de FilterStringConfiguration
A seguinte tabela descreve as propriedades do modo FILTER_STRING:
Propriedade |
Tipo |
Descrição |
|---|---|---|
|
String |
Obrigatório. Chave de parâmetro de consulta (por exemplo, “pesquisar” ou “filtrar”). |
|
Booleano |
Especifica se os valores de String e DateTime devem ficar entre aspas. |
|
String |
Caractere aspas. Padrão: |
Propriedades de BetweenConfiguration
A seguinte tabela descreve as propriedades de tratamento de BETWEEN:
Propriedade |
Modo |
Descrição |
|---|---|---|
|
QUERY_PARAMS |
Modelo de chave para limite inferior. Compatível com o espaço reservado |
|
QUERY_PARAMS |
Modelo de chave para limite superior. Omita para descartar o limite superior. |
|
FILTER_STRING |
Modelo com os espaços reservados |
Operadores compatíveis
Os seguintes operadores são compatíveis com predicados de filtro: EQUAL_TO, GREATER_THAN, LESS_THAN, GREATER_THAN_OR_EQUAL_TO, LESS_THAN_OR_EQUAL_TO, NOT_EQUAL_TO, CONTAINS, BETWEEN, AND, OR.
Substituições no nível do campo
Você pode configurar o comportamento do filtro por campo usando FilterOverrides na definição do esquema. As seguintes propriedades de substituição estão disponíveis:
FieldName: substitui o nome do campo usado na saída do filtro.OperatorMappings: substituições de operador no nível do campo.BetweenConfiguration: substituição de BETWEEN campo a campo.DateTimeFormat: substituição do formato DateTime campo a campo.
Exemplo: modo QUERY_PARAMS
O exemplo a seguir mostra uma FilterConfiguration para uma API REST que usa parâmetros de consulta com notação de colchetes para operadores e timestamps de época em valores de data:
"FilterConfiguration": { "FilterMode": "QUERY_PARAMS", "OperatorMappings": { "EQUAL_TO": "{FIELD}", "GREATER_THAN_OR_EQUAL_TO": "{FIELD}[gte]", "LESS_THAN_OR_EQUAL_TO": "{FIELD}[lte]" }, "DateTimeFormat": "EPOCH_SECONDS", "BetweenConfiguration": { "LowBoundKey": "{FIELD}[gte]", "HighBoundKey": "{FIELD}[lte]" } }
Com essa configuração, um filtro de entrada created >= 2024-01-01 AND created <= 2024-06-01 gera a string de consulta de URL: ?created[gte]=1704067200&created[lte]=1717200000
Exemplo: modo FILTER_STRING
O exemplo a seguir mostra uma FilterConfiguration para uma API REST que usa um único parâmetro de string de filtro com operadores completados com espaços:
"FilterConfiguration": { "FilterMode": "FILTER_STRING", "OperatorMappings": { "EQUAL_TO": " eq ", "GREATER_THAN": " gt ", "GREATER_THAN_OR_EQUAL_TO": " ge ", "LESS_THAN": " lt ", "AND": " and ", "OR": " or " }, "DateTimeFormat": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "BetweenConfiguration": { "Template": "{FIELD} ge {LOW} and {FIELD} le {HIGH}" }, "FilterStringConfiguration": { "FilterStringKey": "search", "QuoteStringValues": true, "QuoteCharacter": "\"" } }
Com essa configuração, um filtro de entrada status = "ACTIVE" AND lastUpdated > 2024-01-01T00:00:00.000Z gera a string de consulta de URL: ?search=status eq "ACTIVE" and lastUpdated gt "2024-01-01T00:00:00.000Z"
Consultas de particionamento
Você pode dividir as leituras de dados em partições paralelas entre operadores Spark para melhorar o throughput. O conector da API REST é compatível com particionamento baseado no campo, que divide os dados em intervalos com base em um campo especificado.
SparkParâmetros de trabalho do
As seguintes opções de conexão controlam o comportamento do particionamento:
PARTITION_FIELD: campo pelo qual particionar. Deve estar marcado comoIsPartitionable: trueno esquema.LOWER_BOUND: limite inferior inclusivo para o intervalo de partições.UPPER_BOUND: limite superior para o intervalo de partições. As partições intermediárias excluem esse valor. A última partição o inclui.NUM_PARTITIONS: número de partições paralelas.
Particionamento com base em campo
O particionamento baseado no campo divide os dados em intervalos com base em um campo especificado. O seguinte exemplo particiona os dados no campo lastUpdated:
rest_read = glueContext.create_dynamic_frame.from_options( connection_type="rest", connection_options={ "connectionName": "connection-name", "ENTITY_NAME": "entity-name", "CONNECTION_TYPE": "REST-connection-type", "PARTITION_FIELD": "lastUpdated", "LOWER_BOUND": "2024-01-01T00:00:00.000Z", "UPPER_BOUND": "2024-12-31T00:00:00.000Z", "NUM_PARTITIONS": "4" } )
Com quatro partições no campo lastUpdated, o trabalho é distribuído da seguinte forma:
Operador 1:
lastUpdated >= "2024-01-01" AND lastUpdated < "2024-04-01"Operador 2:
lastUpdated >= "2024-04-01" AND lastUpdated < "2024-07-01"Operador 3:
lastUpdated >= "2024-07-01" AND lastUpdated < "2024-10-01"Operador 4:
lastUpdated >= "2024-10-01" AND lastUpdated <= "2024-12-31"
Configurar compatibilidade com partição em RegisterConnectionType
Para habilitar o particionamento baseado no campo, marque os campos como particionáveis na definição do esquema:
"Schema": { "lastUpdated": { "FieldDataType": "TIMESTAMP", "IsPartitionable": true } }
Os seguintes valores de FieldDataType são compatíveis com particionamento:
TIMESTAMP: particionamento de DateTime. Divide o intervalo em janelas de tempo.INTEGER: particionamento de números inteiros. Divide o intervalo em janelas numéricas.
nota
O conector combina filtros de partição com filtros de usuário usando AND. Se o filtro contiver uma cláusula LIMIT, o conector ignora o particionamento. Se houver falha na geração da partição, o conector reverterá para uma única partição e o trabalho ainda será concluído.