

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# join
<a name="CWL_QuerySyntax-Join"></a>

소스 로그 그룹의 로그 이벤트를 일치하는 필드를 기반으로 다른 로그 그룹 또는 쿼리 결과의 이벤트와 결합합니다.

`join` 명령을 사용하여 일치하는 요청 식별자 또는 트랜잭션 IDs.

**구문**  


```
join type=<join_type> left=<left_alias> right=<right_alias> 
    where <left_alias>.<field>=<right_alias>.<field> 
    (SOURCE <right_log_group>)
```

**파라미터**  

+ `<right_log_group>` - 조인할 보조 데이터 소스입니다.
+ `<left_alias>` 및 `<right_alias>` - 필드를 왼쪽(기본) 및 오른쪽(보조) 데이터 소스와 구분하는 별칭입니다.
+ `where <field>` - 조인 키로 사용되는 필드를 지정합니다. 필드는 두 데이터 소스 모두에 있어야 합니다.
+ `type=<join_type>` (선택 사항) - 조인 유형을 지정합니다. 유효값은 다음과 같습니다.
  + `inner` (기본값) - 일치하는 레코드만 반환합니다.
  + `left` - 기본 데이터 소스의 모든 레코드와 보조 데이터 소스의 일치하는 레코드를 반환합니다.

**예제**  


**Example 예제 1: API Gateway 요청을 Lambda 실행 로그와 상관관계 분석**  
이 예제에서는 API Gateway 액세스 로그를 Lambda 함수 로그와 조인하여 수신 요청을 백엔드 처리와 연관시키는 방법을 보여줍니다. 이는 end-to-end 요청 흐름 문제를 해결하고 특정 API 요청에 해당하는 Lambda 호출을 식별하는 데 유용합니다.  

```
filter status >= 500
| join type=inner left=api right=lambda 
    where api.requestId=lambda.requestId 
    (SOURCE '/aws/lambda/my-function')
| fields api.requestId, api.status, api.latency, lambda.duration, lambda.memoryUsed
| sort api.latency desc
```
이 쿼리는 다음과 같습니다.  

1. API Gateway 액세스 로그 및 서버 오류 필터 쿼리(상태 >= 500)

1. 두 로그 소스 모두에 표시되는 `requestId` 필드를 사용하여 Lambda 함수 로그와 조인합니다.

1. 별칭(`api` 및 `lambda`)을 사용하여 각 소스와 필드를 구분합니다.

1. Lambda 실행 기간 및 메모리 사용량과 함께 API 지연 시간을 보여주는 결합된 정보를 반환합니다.

1. API 지연 시간을 기준으로 결과를 정렬하여 가장 느린 요청을 식별합니다.

**Example 예제 2: 마이크로서비스 전반의 분산 트랜잭션 추적**  
마이크로서비스 아키텍처에서 문제를 디버깅할 때 여러 서비스에서 트랜잭션을 추적해야 하는 경우가 많습니다. 이 예제에서는 공통 트랜잭션 ID를 사용하여 서로 다른 두 서비스의 로그를 조인하는 방법을 보여줍니다.  

```
filter eventType = "ORDER_CREATED"
| join type=left left=order right=payment 
    where order.transactionId=payment.transactionId 
    (SOURCE '/aws/lambda/payment-service')
| filter payment.eventType = "PAYMENT_PROCESSED" or !ispresent(payment.eventType)
| fields order.transactionId, order.orderId, order.customerId, 
    payment.paymentStatus, payment.amount
| filter payment.paymentStatus != "SUCCESS" or !ispresent(payment.paymentStatus)
```
이 쿼리는 다음과 같습니다.  

1. 주문 서비스의 주문 생성 이벤트로 시작합니다.

1. `left join`를 사용하여 결제 레코드가 일치하지 않는 주문이라도 모든 주문을 포함합니다.

1. 공유 `transactionId` 필드를 사용하여 결제 처리 이벤트에 참여합니다.

1. 최종 결과를 필터링하여 결제 실패 또는 결제 레코드 누락이 있는 주문만 표시합니다.
왼쪽 조인은 생성되었지만 시스템 장애를 나타낼 수 있는 해당 결제 이벤트가 없었던 주문을 볼 수 있도록 하기 때문에 여기서 중요합니다.

**동작**  

+ 기본 데이터 소스(왼쪽)가 먼저 처리됩니다.
+ 보조 데이터 소스는 지정된 조인 키를 사용하여 평가되고 일치됩니다.
+ 매칭은 조인 필드에서 등식 비교를 사용하여 수행됩니다.
+ 왼쪽 조인의 경우 기본 데이터 소스의 일치하지 않는 레코드는 보조 필드에 대해 null 값으로 유지됩니다.

**참고 및 제한 사항**  

+ 등식(=) 조건만 지원됩니다.
+ 쿼리당 하나의 조인 명령만 지원됩니다.
+ 조인 키는 두 데이터 소스 모두에 존재해야 하며 호환되는 유형이어야 합니다.
+ 조인을 사용하는 쿼리는 더 많은 데이터를 스캔하고 더 많은 비용이 발생할 수 있습니다.
+ 쿼리 성능을 보장하기 위해 보조 데이터 소스의 고유 키 값 수는 50,000개로 제한됩니다.
+ 조인 오른쪽에 있는 하위 쿼리는 지원되지 않습니다.

**관련 명령**  

+ [필드](CWL_QuerySyntax-Fields.md)
+ [filter](CWL_QuerySyntax-Filter.md)
+ [구문 분석](CWL_QuerySyntax-Parse.md)
+ [stats](CWL_QuerySyntax-Stats.md)
+ [정렬](CWL_QuerySyntax-Sort.md)
+ [limit](CWL_QuerySyntax-Limit.md)