REST API からの読み取り
REST API ConnectionType を登録して AWS Glue 接続を作成したら、AWS Glue ETL ジョブの REST API からデータを読み取ることができます。この接続を使用すると、外部 REST API データを同じジョブ内の他のソースと一緒に処理できます。データを読み取るには、接続名とエンティティ名が必要です。
次の例に、Python を使用して、REST API データソースからの読み取りを実行する方法を示します。
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" } )
データのフィルタリング
フィルター述語をソース REST API にプッシュダウンして、転送されるデータ量を減らすことができます。REST API コネクタは、以下の 2 つのフィルターモードをサポートしています。
QUERY_PARAMS – 各フィルターは個別の URL クエリパラメータになります。例:
?created[gte]=1704067200&created[lte]=1717200000FILTER_STRING – すべてのフィルターが 1 つのクエリパラメータに結合されます。例:
?search=status eq "ACTIVE" and lastUpdated gt "2024-01-01"
AWS Glue ETL ジョブにフィルター述語を適用するには、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\"" } )
FilterConfiguration プロパティ
FilterConfiguration オブジェクトを使用して ConnectionType 登録でフィルタリング動作を設定します。以下の表で、利用できるプロパティについて説明します。
プロパティ |
型 |
説明 |
|---|---|---|
|
文字列 |
必須。 |
|
マップ |
論理演算子を API 固有の構文にマッピングします。 |
|
String |
DateTime 形式パターンまたは |
|
ブール値 |
入力値から周囲の引用符を除去するかどうかを指定します。デフォルト: |
|
オブジェクト |
デフォルトの BETWEEN 処理設定。 |
|
オブジェクト |
|
FilterStringConfiguration プロパティ
次のテーブルは、FILTER_STRING モードのプロパティについての説明です。
プロパティ |
型 |
説明 |
|---|---|---|
|
文字列 |
必須。クエリパラメータキー (例:「search」や「filter」)。 |
|
ブール値 |
文字列値と DateTime 値を引用符で囲むかどうかを指定します。 |
|
String |
引用文字。デフォルト: |
BetweenConfiguration プロパティ
次のテーブルは、BETWEEN 処理プロパティについての説明です。
プロパティ |
モード |
説明 |
|---|---|---|
|
QUERY_PARAMS |
下限のキーテンプレート。 |
|
QUERY_PARAMS |
上限のキーテンプレート。省略すると上限が削除されます。 |
|
FILTER_STRING |
|
サポートされている演算子
フィルター述語では、EQUAL_TO、GREATER_THAN、LESS_THAN、GREATER_THAN_OR_EQUAL_TO、LESS_THAN_OR_EQUAL_TO、NOT_EQUAL_TO、CONTAINS、BETWEEN、AND、OR の演算子がサポートされています。
フィールドレベルのオーバーライド
スキーマ定義の FilterOverrides を使用してフィールドごとのフィルター動作を設定できます。以下のオーバーライドプロパティを使用できます。
FieldName- フィルター出力で使用されるフィールド名をオーバーライドします。OperatorMappings- フィールドレベルの演算子オーバーライド。BetweenConfiguration- フィールドごとの BETWEEN オーバーライド。DateTimeFormat- フィールドごとの DateTime 形式のオーバーライド。
例: QUERY_PARAMS モード
次の例は、演算子に角括弧表記、日付値にエポックタイムスタンプのクエリパラメータを使用する REST API の FilterConfiguration を示しています。
"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]" } }
この設定では、created >= 2024-01-01 AND created <= 2024-06-01 の入力フィルターによって URL クエリ文字列が生成されます。?created[gte]=1704067200&created[lte]=1717200000
例: FILTER_STRING モード
次の例は、スペース詰め演算子で単一のフィルター文字列パラメータを使用する REST API の FilterConfiguration を示しています。
"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": "\"" } }
この設定では、status = "ACTIVE" AND lastUpdated > 2024-01-01T00:00:00.000Z の入力フィルターによって URL クエリ文字列が生成されます。?search=status eq "ACTIVE" and lastUpdated gt "2024-01-01T00:00:00.000Z"
パーティショニングクエリ
データ読み取りを Spark ワーカー間で並列パーティションに分割して、スループットを向上させることができます。REST API コネクタは、指定されたフィールドに基づいてデータを範囲に分割するフィールドベースのパーティショニングをサポートします。
Spark ジョブのパラメータ
次の接続オプションは、パーティショニングの動作を制御します。
PARTITION_FIELD- パーティション化するフィールド。スキーマでIsPartitionable: trueとしてマークする必要があります。LOWER_BOUND- パーティション範囲の包括的な下限。UPPER_BOUND- パーティション範囲の上限。中間パーティションは、この値を除外します。最後のパーティションにはこの値が含まれます。NUM_PARTITIONS- 並列パーティションの数。
フィールドベースのパーティション分割
フィールドベースのパーティショニングは、指定されたフィールドに基づいてデータを範囲に分割します。次の例では、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" } )
lastUpdated フィールドに 4 つのパーティションがある場合、作業は次のように分散されます。
ワーカー 1:
lastUpdated >= "2024-01-01" AND lastUpdated < "2024-04-01"ワーカー 2:
lastUpdated >= "2024-04-01" AND lastUpdated < "2024-07-01"ワーカー 3:
lastUpdated >= "2024-07-01" AND lastUpdated < "2024-10-01"ワーカー 4:
lastUpdated >= "2024-10-01" AND lastUpdated <= "2024-12-31"
RegisterConnectionType でのパーティションサポートの設定
フィールドベースのパーティショニングを有効にするには、スキーマ定義でフィールドをパーティションニング可能としてマークします。
"Schema": { "lastUpdated": { "FieldDataType": "TIMESTAMP", "IsPartitionable": true } }
パーティション分割では、以下の FieldDataType 値がサポートされています。
TIMESTAMP- DateTime パーティショニング。範囲を時間枠に分割します。INTEGER- 整数パーティショニング。範囲を数値枠に分割します。
注記
コネクタは、AND を使用してパーティションフィルターとユーザーフィルターを組み合わせます。フィルターに LIMIT 句が含まれている場合、コネクタはパーティショニングをスキップします。パーティションの生成に失敗した場合、コネクタは 1 つのパーティションにフォールバックし、ジョブは引き続き完了します。