

Amazon Timestream for LiveAnalytics와 유사한 기능을 원하는 경우 Amazon Timestream for InfluxDB를 고려해 보세요. 간소화된 데이터 수집과 실시간 분석을 위한 10밀리초 미만의 쿼리 응답 시간을 제공합니다. [여기](https://docs.aws.amazon.com//timestream/latest/developerguide/timestream-for-influxdb.html)에서 자세히 알아보세요.

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

# UNLOAD를 사용하여 Timestream for LiveAnalytics에서 S3로 쿼리 결과 내보내기
<a name="export-unload"></a>

이제 Amazon Timestream for LiveAnalytics에서 `UNLOAD` 문을 사용하여 쿼리 결과를 비용 효과적이고 안전한 방식으로 Amazon S3로 내보낼 수 있습니다. `UNLOAD` 문을 사용하면 이제 선택한 S3 버킷으로 시계열 데이터를 Apache Parquet 또는 CSV(쉼표로 구분된 값) 형식으로 내보낼 수 있습니다. 이를 통해 다른 서비스와 함께 시계열 데이터를 저장, 결합 및 분석할 수 있는 유연성을 확보할 수 있습니다. `UNLOAD` 문을 사용하면 데이터를 압축된 방식으로 내보낼 수 있으므로 전송되는 데이터 양과 필요한 스토리지 공간이 줄어듭니다. 또한 `UNLOAD`는 데이터를 내보낼 때 선택한 속성을 기반으로 파티셔닝을 지원하므로 성능이 향상되고 데이터에 액세스하는 다운스트림 서비스의 처리 시간이 단축됩니다. 또한 Amazon S3 관리형 키(SSE-S3) 또는 AWS Key Management Service(AWS KMS) 관리형 키(SSE-KMS)를 사용하여 내보낸 데이터를 암호화할 수 있습니다.

## Timestream for LiveAnalytics의 UNLOAD 사용에 따른 이점
<a name="export-unload-benefits"></a>

`UNLOAD` 문 사용에 따른 주요 이점은 다음과 같습니다.
+ **운영 편의성** - `UNLOAD` 문을 사용하면 단일 쿼리 요청으로 수 기가바이트의 데이터를 Apache Parquet 또는 CSV 형식으로 내보낼 수 있으므로, 다운스트림 처리 요구 사항에 가장 적합한 형식을 유연하게 선택할 수 있고 데이터 레이크 구축이 더욱 쉬워집니다.
+ **보안 및 비용 효율성** - `UNLOAD` 문은 데이터를 압축된 형태로 S3 버킷으로 내보내고 고객 관리형 키를 사용하여 데이터를 암호화(SSE-KMS 또는 SSE\$1S3)하는 기능을 제공하여 데이터 스토리지 비용을 절감하고 무단 액세스로부터 보호합니다.
+ **성능** - `UNLOAD` 문을 사용하여 S3 버킷으로 내보낼 때 데이터를 파티셔닝할 수 있습니다. 데이터를 파티셔닝하면 다운스트림 서비스가 병렬로 데이터를 처리하여 처리 시간을 줄일 수 있습니다. 또한 다운스트림 서비스는 필요한 데이터만 처리하여 필요한 처리 리소스를 줄여 관련 비용을 절감할 수 있습니다.

## Timestream for LiveAnalytics의 UNLOAD 사용 사례
<a name="export-unload-use-cases"></a>

`UNLOAD` 문을 사용하여 다음과 같이 S3 버킷에 데이터를 쓸 수 있습니다.
+ **데이터 웨어하우스 구축** - 수 기가바이트의 쿼리 결과를 S3 버킷으로 내보내고, 데이터 레이크에 시계열 데이터를 보다 쉽게 추가할 수 있습니다. Amazon Athena, Amazon Redshift 등의 서비스를 사용해서 시계열 데이터를 다른 관련 데이터와 결합하여 복잡한 비즈니스 인사이트를 도출할 수 있습니다.
+ **AI 및 ML 데이터 파이프라인 구축** - `UNLOAD` 문을 사용하면 시계열 데이터에 액세스하는 기계 학습 모델용 데이터 파이프라인을 쉽게 구축할 수 있으므로 Amazon SageMaker, Amazon EMR 등의 서비스에서 시계열 데이터를 더 쉽게 사용할 수 있습니다.
+ **ETL 처리 간소화** - 데이터를 S3 버킷으로 내보내면 데이터에 대한 추출, 변환, 로드(ETL) 작업을 수행하는 프로세스를 간소화하여 AWS Glue와 같은 타사 도구 또는 AWS 서비스를 원활하게 사용하여 데이터를 처리하고 변환할 수 있습니다.

# UNLOAD 개념
<a name="export-unload-concepts"></a>

## 구문
<a name="export-unload-concepts-syntax"></a>

```
UNLOAD (SELECT statement)
 TO 's3://bucket-name/folder'
 WITH ( option = expression [, ...] )
```

여기서 `option`은

```
{ partitioned_by = ARRAY[ col_name[,…] ] 
 | format = [ '{ CSV | PARQUET }' ] 
 | compression = [ '{ GZIP | NONE }' ]
 | encryption = [ '{ SSE_KMS | SSE_S3 }' ]
 | kms_key = '<string>'
 | field_delimiter ='<character>'
 | escaped_by = '<character>'
 | include_header = ['{true, false}']
 | max_file_size = '<value>'
 | }
```

## 파라미터
<a name="export-unload-concepts-parameters"></a>

SELECT 명령문  
하나 이상의 Timestream for LiveAnalytics 테이블에서 데이터를 선택하고 검색하는 데 사용되는 쿼리 문입니다.  

```
(SELECT column 1, column 2, column 3 from database.table
      where measure_name = "ABC" and timestamp between ago (1d) and now() )
```

TO 절  

```
TO 's3://bucket-name/folder'
```
또는  

```
TO 's3://access-point-alias/folder'
```
`UNLOAD` 문의 `TO` 절은 쿼리 결과의 출력 대상을 지정합니다. Timestream for LiveAnalytics가 출력 파일 객체를 저장하는 Amazon S3 버킷 이름 또는 Amazon S3 액세스 포인트 별칭과 폴더 위치를 포함한 전체 경로를 제공해야 합니다. S3 버킷은 동일한 계정 소유여야 하며 동일한 리전에 있어야 합니다. 쿼리 결과 세트 외에도 Timestream for LiveAnalytics는 지정된 대상 폴더에 매니페스트 및 메타데이터 파일을 씁니다.

PARTITIONED\$1BY 절  

```
partitioned_by = ARRAY [col_name[,…] , (default: none)
```
`partitioned_by` 절은 쿼리에서 데이터를 세분화된 수준으로 그룹화하고 분석하는 데 사용됩니다. S3 버킷으로 쿼리 결과를 내보낼 때 select 쿼리의 하나 이상의 열을 기준으로 데이터를 파티셔닝하도록 선택할 수 있습니다. 데이터를 파티셔닝할 때 내보낸 데이터는 파티션 열을 기준으로 하위 집합으로 분할되고 각 하위 집합은 별도의 폴더에 저장됩니다. 내보낸 데이터가 포함된 결과 폴더 내에 하위 폴더 `folder/results/partition column = partition value/`가 자동으로 생성됩니다. 그러나 파티셔닝된 열은 출력 파일에 포함되지 않습니다.  
`partitioned_by`는 구문의 필수 절이 아닙니다. 파티셔닝 없이 데이터를 내보내기로 선택한 경우 구문에서 해당 절을 생략할 수 있습니다.  

**Example**  
웹사이트의 클릭스트림 데이터를 모니터링하고 있으며 `direct`, `Social Media`, `Organic Search`, `Other`, `Referral`의 5가지 트래픽 채널이 있다고 가정해 보겠습니다. 데이터를 내보낼 때 `Channel` 열을 사용하여 데이터를 파티셔닝하도록 선택할 수 있습니다. 데이터 폴더인 `s3://bucketname/results` 안에는 각 채널 이름으로 된 5개의 폴더가 있습니다. 예를 들면 `s3://bucketname/results/channel=Social Media/.`입니다. 이 폴더 안에는 `Social Media` 채널을 통해 웹사이트에 방문한 모든 고객의 데이터가 포함되어 있습니다. 나머지 채널을 위한 다른 폴더도 있습니다.
채널 열을 기준으로 파티셔닝된 내보낸 데이터  

![\[Folder structure showing channels: Direct, Organic search, Other, Referral, and Social media.\]](http://docs.aws.amazon.com/ko_kr/timestream/latest/developerguide/images/unload-results.png)


FORMAT  

```
format = [ '{ CSV | PARQUET }' , default: CSV
```
S3 버킷에 작성된 쿼리 결과의 형식을 지정하는 키워드입니다. 쉼표(,)를 기본 구분 기호로 사용하거나 분석을 위한 효율적인 개방형 컬럼형 스토리지 형식인 Apache Parquet 형식으로 데이터를 쉼표로 구분된 값(CSV)으로 내보낼 수 있습니다.

COMPRESSION  

```
compression = [ '{ GZIP | NONE }' ], default: GZIP
```
압축 알고리즘 GZIP을 사용하여 내보낸 데이터를 압축하거나 `NONE` 옵션을 지정하여 압축을 해제할 수 있습니다.

ENCRYPTION  

```
encryption = [ '{ SSE_KMS | SSE_S3 }' ], default: SSE_S3
```
Amazon S3의 출력 파일은 선택한 암호화 옵션을 사용하여 암호화됩니다. 데이터 외에도 선택한 암호화 옵션에 따라 매니페스트 파일과 메타데이터 파일도 암호화됩니다. 현재 SSE\$1S3 및 SSE\$1KMS 암호화를 지원합니다. SSE\$1S3는 Amazon S3가 256비트 고급 암호화 표준(AES) 암호화를 사용하여 데이터를 암호화하는 서버 측 암호화입니다. SSE\$1KMS는 고객 관리형 키를 사용하여 데이터를 암호화하는 서버 측 암호화입니다.

KMS\$1KEY  

```
kms_key = '<string>'
```
KMS 키는 내보낸 쿼리 결과를 암호화하기 위한 고객 정의 키입니다. KMS 키는 AWS Key Management Service(AWS KMS)에서 안전하게 관리되며 Amazon S3의 데이터 파일을 암호화하는 데 사용됩니다.

FIELD\$1DELIMITER  

```
field_delimiter ='<character>' , default: (,)
```
데이터를 CSV 형식으로 내보낼 때 이 필드는 파이프 문자(\$1), 쉼표(,) 또는 탭(\$1t) 같이 출력 파일에서 필드를 구분할 때 사용할 단일 ASCII 문자를 지정합니다. CSV 파일의 기본 구분 기호는 쉼표 문자입니다. 데이터의 값에 선택한 구분 기호가 포함되어 있으면 해당 구분 기호는 따옴표로 묶입니다. 예를 들어, 데이터의 값에 `Time,stream`이 포함되어 있으면 이 값은 내보낸 데이터에서 `"Time,stream"`으로 따옴표 처리됩니다. Timestream for LiveAnalytics에서 사용하는 따옴표 문자는 큰따옴표(")입니다.  
CSV에 헤더를 포함시키려면 캐리지 리턴 문자(ASCII 13, 16진수 `0D`, 텍스트 '\$1r') 또는 줄 바꿈 문자(ASCII 10, 16진수 0A, 텍스트 '\$1n')를 `FIELD_DELIMITER`로 지정하지 마세요. 그러면 많은 파서가 결과 CSV 출력에서 ​​헤더를 제대로 구문 분석하지 못합니다.

ESCAPED\$1BY  

```
escaped_by = '<character>', default: (\)
```
CSV 형식으로 데이터를 내보낼 때 이 필드는 S3 버킷에 작성되는 데이터 파일에서 이스케이프 문자로 처리되어야 하는 문자를 지정합니다. 다음 시나리오에서 이스케이프가 발생할 수 있습니다.  

1. 자체에 따옴표(") 문자를 포함하는 값은 이스케이프 문자를 사용하여 이스케이프 처리됩니다. 예를 들어, 값이 `Time"stream`이고 (\$1)가 구성된 이스케이프 문자인 경우 `Time\"stream`으로 이스케이프 처리됩니다.

1. 구성된 이스케이프 문자를 포함하는 값은 이스케이프 처리됩니다. 예를 들어 값이 `Time\stream`인 경우 `Time\\stream`으로 이스케이프 처리됩니다.
배열, 행 또는 시계열과 같은 복소수 데이터 유형을 포함하는 내보낸 출력은 JSON 문자열로 직렬화됩니다. 다음은 한 예입니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/timestream/latest/developerguide/export-unload-concepts.html)

INCLUDE\$1HEADER  

```
include_header = 'true' , default: 'false'
```
CSV 형식으로 데이터를 내보낼 때 이 필드를 사용하면 내보낸 CSV 데이터 파일의 첫 번째 행으로 열 이름을 포함할 수 있습니다.  
허용되는 값은 'true'와 'false'이고 기본값은 'false'입니다. `escaped_by`, `field_delimiter` 등의 텍스트 변환 옵션은 헤더에도 적용됩니다.  
헤더를 포함할 때 캐리지 리턴 문자(ASCII 13, 16진수 0D, 텍스트 '\$1r') 또는 줄 바꿈 문자(ASCII 10, 16진수 0A, 텍스트 '\$1n')를 `FIELD_DELIMITER`로 선택하면 안 됩니다. 그러면 많은 파서가 결과 CSV 출력에서 ​​헤더를 제대로 구문 분석하지 못합니다.

MAX\$1FILE\$1SIZE  

```
max_file_size = 'X[MB|GB]' , default: '78GB'
```
이 필드는 `UNLOAD` 문이 Amazon S3에 생성하는 파일의 최대 크기를 지정합니다. `UNLOAD` 문은 여러 파일을 생성할 수 있지만 Amazon S3에 작성되는 각 파일의 최대 크기는 이 필드에 지정된 값과 대략 일치합니다.  
필드 값은 16MB에서 78GB 사이(포함)여야 합니다. `12GB`와 같은 정수로 지정하거나 `0.5GB` 또는 `24.7MB`와 같은 소수로 지정할 수 있습니다. 기본값은 78GB입니다.  
파일을 쓸 때 실제 파일 크기는 근사값이므로 실제 최대 크기가 지정한 숫자와 정확히 같지 않을 수 있습니다.

## S3 버킷에는 무엇이 작성되나요?
<a name="export-unload-common-questions-what-is-written"></a>

성공적으로 실행된 모든 UNLOAD 쿼리에 대해 Timestream for LiveAnalytics는 S3 버킷에 쿼리 결과, 메타데이터 파일 및 매니페스트 파일을 작성합니다. 데이터를 파티셔닝한 경우 결과 폴더에 모든 파티션 폴더가 있습니다. 매니페스트 파일에는 UNLOAD 명령에 의해 작성된 파일 목록이 포함되어 있습니다. 메타데이터 파일에는 작성된 데이터의 특성과 속성을 설명하는 정보가 포함되어 있습니다.

## 내보낸 파일 이름은 무엇인가요?
<a name="export-unload-common-questions-what-is-filename"></a>

내보낸 파일 이름은 두 가지 구성 요소로 이루어져 있습니다. 첫 번째 구성 요소는 queryID이고, 두 번째 구성 요소는 고유 식별자입니다.

CSV 파일

```
S3://bucket_name/results/<queryid>_<UUID>.csv
S3://bucket_name/results/<partitioncolumn>=<partitionvalue>/<queryid>_<UUID>.csv
```

압축된 CSV 파일

```
S3://bucket_name/results/<partitioncolumn>=<partitionvalue>/<queryid>_<UUID>.gz 
```

Parquet 파일

```
S3://bucket_name/results/<partitioncolumn>=<partitionvalue>/<queryid>_<UUID>.parquet
```

메타데이터 및 매니페스트 파일

```
S3://bucket_name/<queryid>_<UUID>_manifest.json 
S3://bucket_name/<queryid>_<UUID>_metadata.json
```

CSV 형식의 데이터는 파일 수준에서 저장되므로 S3로 내보낼 때 데이터를 압축하면 파일 확장자가 ‘.gz’가 됩니다. 그러나 Parquet의 데이터는 열 수준에서 압축되므로 내보내는 동안 데이터를 압축하더라도 파일 확장자는 여전히 .parquet입니다.

## 각 파일에는 어떤 정보가 포함되어 있나요?
<a name="export-unload-common-questions-what-information"></a>

### 매니페스트 파일
<a name="export-unload-common-questions-what-information-manifest"></a>

매니페스트 파일은 UNLOAD 실행 시 내보내지는 파일 목록에 대한 정보를 제공합니다. 매니페스트 파일은 파일 이름이 `s3://<bucket_name>/<queryid>_<UUID>_manifest.json`인 제공된 S3 버킷에 있습니다. 매니페스트 파일에는 결과 폴더 내 파일의 URL, 각 파일의 레코드 수 및 크기, 쿼리 메타데이터(쿼리에 대해 S3로 내보낸 총 바이트 수와 총 행 수)가 포함됩니다.

```
{
  "result_files": [
    {
        "url":"s3://my_timestream_unloads/ec2_metrics/AEDAGANLHLBH4OLISD3CVOZZRWPX5GV2XCXRBKCVD554N6GWPWWXBP7LSG74V2Q_1448466917_szCL4YgVYzGXj2lS.gz", 
        "file_metadata": 
            { 
                "content_length_in_bytes": 32295, 
                "row_count": 10 
            }
    },
    {
        "url":"s3://my_timestream_unloads/ec2_metrics/AEDAGANLHLBH4OLISD3CVOZZRWPX5GV2XCXRBKCVD554N6GWPWWXBP7LSG74V2Q_1448466917_szCL4YgVYzGXj2lS.gz", 
        "file_metadata": 
            { 
                "content_length_in_bytes": 62295, 
                "row_count": 20 
            }
    },
  ],
  "query_metadata": 
    {
      "content_length_in_bytes": 94590, 
      "total_row_count": 30,
      "result_format": "CSV",
      "result_version": "Amazon Timestream version 1.0.0"  
    },
  "author": {
        "name": "Amazon Timestream", 
        "manifest_file_version": "1.0" 
  }
}
```

### Metadata
<a name="export-unload-common-questions-what-information-metadata"></a>

메타데이터 파일은 데이터세트에 대한 열 이름, 열 유형, 스키마 등의 추가 정보를 제공합니다. 메타데이터 파일은 파일 이름이 S3://bucket\$1name/<queryid>\$1<UUID>\$1metadata.json인 제공된 S3 버킷에서 사용할 수 있습니다.

다음은 메타데이터 파일의 예제입니다.

```
{
    "ColumnInfo": [
        {
            "Name": "hostname",
            "Type": {
                "ScalarType": "VARCHAR"
            }
        },
        {
            "Name": "region",
            "Type": {
                "ScalarType": "VARCHAR"
            }
        },
        {
            "Name": "measure_name",
            "Type": {
                "ScalarType": "VARCHAR"
            }
        },
        {
            "Name": "cpu_utilization",
            "Type": {
                "TimeSeriesMeasureValueColumnInfo": {
                    "Type": {
                        "ScalarType": "DOUBLE"
                    }
                }
            }
        }
  ],
  "Author": {
        "Name": "Amazon Timestream", 
        "MetadataFileVersion": "1.0" 
  }
}
```

메타데이터 파일에 공유된 열 정보는 `SELECT` 쿼리에 대한 쿼리 API 응답에서 전송되는 `ColumnInfo`와 동일한 구조를 가집니다.

### 결과
<a name="export-unload-common-questions-what-information-results"></a>

결과 폴더에는 내보낸 데이터가 Apache Parquet 또는 CSV 형식으로 포함되어 있습니다.

## 예제
<a name="export-unload-example-short"></a>

쿼리 API를 통해 아래와 같은 `UNLOAD` 쿼리를 제출하면

```
UNLOAD(SELECT user_id, ip_address, event, session_id, measure_name, time, query, quantity, product_id, channel 
                    FROM sample_clickstream.sample_shopping WHERE time BETWEEN ago(2d) AND now()) 
                TO 's3://my_timestream_unloads/withoutpartition/' WITH ( format='CSV', compression='GZIP')
```

`UNLOAD` 쿼리 응답에는 행 1개 \$1 열 3개가 있습니다. 이러한 3개의 열은 다음과 같습니다.
+ BIGINT 유형의 행 - 내보낸 행 수를 나타냄
+ VARCHAR 유형의 metadataFile - 내보낸 메타데이터 파일의 S3 URI
+ VARCHAR 유형의 manifestFile - 내보낸 매니페스트 파일의 S3 URI

쿼리 API로부터 다음과 같은 응답을 받게 됩니다.

```
{
    "Rows": [
        {
            "Data": [
                {
                    "ScalarValue": "20" # No of rows in output across all files
                },
                {
                    "ScalarValue": "s3://my_timestream_unloads/withoutpartition/AEDAAANGH3D7FYHOBQGQQMEAISCJ45B42OWWJMOT4N6RRJICZUA7R25VYVOHJIY_<UUID>_metadata.json" #Metadata file
                },
                {
                    "ScalarValue": "s3://my_timestream_unloads/withoutpartition/AEDAAANGH3D7FYHOBQGQQMEAISCJ45B42OWWJMOT4N6RRJICZUA7R25VYVOHJIY_<UUID>_manifest.json" #Manifest file
                }
            ]
        }
    ],
    "ColumnInfo": [
        {
            "Name": "rows",
            "Type": {
                "ScalarType": "BIGINT"
            }
        },
        {
            "Name": "metadataFile",
            "Type": {
                "ScalarType": "VARCHAR"
            }
        },
        {
            "Name": "manifestFile",
            "Type": {
                "ScalarType": "VARCHAR"
            }
        }
    ],
    "QueryId": "AEDAAANGH3D7FYHOBQGQQMEAISCJ45B42OWWJMOT4N6RRJICZUA7R25VYVOHJIY",
    "QueryStatus": {
        "ProgressPercentage": 100.0,
        "CumulativeBytesScanned": 1000,
        "CumulativeBytesMetered": 10000000
    }
}
```

## 데이터 타입
<a name="export-unload-data-types-explanation"></a>

`UNLOAD` 문은 [지원되는 데이터 유형](supported-data-types.md)에 설명된 Timestream for LiveAnalytics의 모든 데이터 유형을 지원하지만 `time`과 `unknown`은 지원하지 않습니다.

# Timestream for LiveAnalytics의 UNLOAD에 대한 사전 요구 사항
<a name="export-unload-prerequisites"></a>

다음은 Timestream for LiveAnalytics의 `UNLOAD`를 사용하여 S3에 데이터를 작성하기 위한 사전 요구 사항입니다.
+ Timestream for LiveAnalytics 테이블에서 `UNLOAD` 명령에 사용할 데이터를 읽을 수 있는 권한이 있어야 합니다.
+ Timestream for LiveAnalytics 리소스와 동일한 AWS 리전에 Amazon S3 버킷이 있어야 합니다.
+ 선택한 S3 버킷에 대해 [S3 버킷 정책](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html)에 Timestream for LiveAnalytics가 데이터를 내보낼 수 있도록 허용하는 권한이 있는지 확인하세요.
+ `UNLOAD` 쿼리를 실행하는 데 사용되는 자격 증명에는 Timestream for LiveAnalytics가 S3에 데이터를 쓸 수 있도록 허용하는 필요한 AWS Identity and Access Management(IAM) 권한이 있어야 합니다. 예제 정책은 다음과 같습니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
            "Effect": "Allow",
            "Action": [
                "timestream:Select",
                "timestream:ListMeasures",
                "timestream:WriteRecords",
                "timestream:Unload"
            ],
            "Resource": "arn:aws:timestream:us-east-2:111122223333:database/database_name/table/table_name"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketAcl",
                "s3:PutObject",
                "s3:GetObject",
                "s3:AbortMultipartUpload"
            ],
            "Resource": [
                "arn:aws:s3:::S3_Bucket_Created",
                "arn:aws:s3:::S3_Bucket_Created/*"
            ]
        }
    ]
}
```

------

이러한 S3 쓰기 권한에 대한 추가 컨텍스트는 [Amazon Simple Storage Service 가이드](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpuAndPermissions)를 참조하세요. 내보낸 데이터를 암호화하는 데 KMS 키를 사용하는 경우 필요한 추가 IAM 정책은 다음을 참조하세요.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
            "kms:DescribeKey",
            "kms:Decrypt",
            "kms:GenerateDataKey*"
        ],
        "Resource": "arn:aws:kms:us-east-2:111122223333:key/*",
        "Condition": {
            "ForAnyValue:StringLike": {
                "kms:ResourceAliases": "alias/Alias_For_Generated_Key"
            }
        }
    }, {
        "Effect": "Allow",
        "Action": [
            "kms:CreateGrant"
        ],
        "Resource": "arn:aws:kms:us-east-2:111122223333:key/*",
        "Condition": {
            "ForAnyValue:StringEquals": {
                "kms:EncryptionContextKeys": "aws:timestream:database_name"
            },
            "Bool": {
                "kms:GrantIsForAWSResource": true
            },
            "StringLike": {
                "kms:ViaService": "timestream.us-east-2.amazonaws.com"
            },
            "ForAnyValue:StringLike": {
                "kms:ResourceAliases": "alias/Alias_For_Generated_Key"
            }
        }
    }
]
}
```

------

# Timestream for LiveAnalytics의 UNLOAD 모범 사례
<a name="export-unload-best-practices"></a>

다음은 UNLOAD 명령과 관련된 모범 사례입니다.
+ `UNLOAD` 명령을 사용하여 S3 버킷으로 내보낼 수 있는 데이터 양에는 제한이 없습니다. 그러나 쿼리는 60분 후에 시간 초과되며 단일 쿼리에서 60GB 이상의 데이터를 내보내지 않는 것이 좋습니다. 60GB 이상의 데이터를 내보내야 하는 경우 작업을 여러 쿼리로 분할합니다.
+ S3에 데이터를 업로드하기 위해 수천 건의 요청을 보낼 수도 있지만 여러 S3 접두사에 대한 쓰기 작업을 병렬화하는 것이 좋습니다. [설명서](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html)를 참조하세요. 여러 리더/라이터가 동일한 폴더에 액세스할 때 S3 API 직접 호출 속도가 스로틀링될 수 있습니다.
+ 접두사 정의를 위한 S3 키 길이 제한이 있으므로 특히 `partitioned_by` 절을 사용하는 경우 버킷 및 폴더 이름은 10\$115자 이내로 지정하는 것이 좋습니다.
+ `UNLOAD` 문을 포함하는 쿼리에 대해 4XX 또는 5XX 오류가 발생하는 경우 부분 결과가 S3 버킷에 작성되었을 가능성이 있습니다. Timestream for LiveAnalytics는 버킷에서 데이터를 삭제하지 않습니다. 동일한 S3 대상에 대해 다른 `UNLOAD` 쿼리를 실행하기 전에 실패한 쿼리로 생성된 파일을 수동으로 삭제하는 것이 좋습니다. 실패한 쿼리에 의해 작성된 파일은 해당 `QueryExecutionId`로 식별할 수 있습니다. 실패한 쿼리의 경우 Timestream for LiveAnalytics는 S3 버킷으로 매니페스트 파일을 내보내지 않습니다.
+ Timestream for LiveAnalytics는 S3로 쿼리 결과를 내보내기 위해 다중 부분 업로드를 사용합니다. UNLOAD 문을 포함하는 쿼리에 대해 Timestream for LiveAnalytics에서 4XX 또는 5XX 오류가 발생하는 경우 Timestream for LiveAnalytics는 다중 부분 업로드를 최대한 중단하려고 시도하지만 일부 불완전한 부분이 남아 있을 수 있습니다. 따라서 [여기](https://aws.amazon.com/blogs/aws-cloud-financial-management/discovering-and-deleting-incomplete-multipart-uploads-to-lower-amazon-s3-costs/) 지침에 따라 S3 버킷에서 불완전한 다중 부분 업로드의 자동 정리를 설정하는 것이 좋습니다.

## CSV 파서를 사용하여 CSV 형식의 데이터에 액세스하기 위한 권장 사항
<a name="export-unload-common-questions-what-information-recommendations-csv"></a>
+ CSV 파서는 구분 기호, 이스케이프 및 따옴표에 동일한 문자를 사용하는 것을 허용하지 않습니다.
+ 일부 CSV 파서는 배열과 같은 복소수 데이터 유형을 해석할 수 없으므로 JSON 역직렬화기를 통해 해석하는 것이 좋습니다.

## Parquet 형식의 데이터에 액세스하기 위한 권장 사항
<a name="export-unload-common-questions-what-information-recommendations-parquet"></a>

1. 사용 사례에서 스키마 즉, 열 이름에 UTF-8 문자 지원이 필요한 경우 [Parquet-mr 라이브러리](https://github.com/apache/parquet-mr) 사용을 권장합니다.

1. 결과의 타임스탬프는 12바이트 정수(INT96)로 표현됩니다.

1. 시계열은 `array<row<time, value>>`로 표현되며 다른 중첩된 구조는 Parquet 형식으로 지원되는 해당 데이터 유형을 사용합니다.

## partition\$1by 절 사용
<a name="export-unload-best-practices-partition-by"></a>
+ `partitioned_by` 필드에 사용되는 열은 select 쿼리의 마지막 열이어야 합니다. `partitioned_by` 필드에 여러 열이 사용되는 경우 해당 열들은 select 쿼리의 마지막 열이어야 하며 `partition_by` 필드에 사용된 순서와 동일해야 합니다.
+ 데이터를 파티셔닝하는 데 사용되는 열 값(`partitioned_by` 필드)에는 ASCII 문자만 포함될 수 있습니다. Timestream for LiveAnalytics는 값에 UTF-8 문자를 허용하지만 S3는 객체 키로 ASCII 문자만 지원합니다.

# Timestream for LiveAnalytics의 UNLOAD 사용 사례 예제
<a name="export-unload-example-use-case"></a>

전자상거래 웹사이트의 사용자 세션 지표, 트래픽 소스 및 제품 구매를 모니터링하고 있다고 가정해 보겠습니다. Timestream for LiveAnalytics를 사용하여 사용자 동작 및 제품 판매에 대한 실시간 인사이트를 도출하고, 웹사이트로 고객을 유도하는 트래픽 채널(오가닉 검색, 소셜 미디어, 직접 방문, 유료 캠페인 등)에 대한 마케팅 분석을 수행하고 있습니다.

**Topics**
+ [파티션 없이 데이터 내보내기](#export-unload-example-sample-1)
+ [채널별 데이터 파티셔닝](#export-unload-example-sample-2)
+ [이벤트별 데이터 파티셔닝](#export-unload-example-sample-3)
+ [채널과 이벤트별 데이터 파티셔닝](#export-unload-example-sample-4)
+ [매니페스트 및 메타데이터 파일](#export-unload-example-manifest-metadata)
+ [Glue 크롤러를 사용하여 Glue Data Catalog 구축](#export-unload-example-using-glue-crawlers)

## 파티션 없이 데이터 내보내기
<a name="export-unload-example-sample-1"></a>

최근 이틀간의 데이터를 CSV 형식으로 내보내려고 합니다.

```
UNLOAD(SELECT user_id, ip_address, event, session_id, measure_name, time, 
query, quantity, product_id, channel 
FROM sample_clickstream.sample_shopping 
WHERE time BETWEEN ago(2d) AND now())  
TO 's3://<bucket_name>/withoutpartition' 
WITH (  format='CSV',   
compression='GZIP')
```

## 채널별 데이터 파티셔닝
<a name="export-unload-example-sample-2"></a>

최근 이틀간의 데이터를 CSV 형식으로 내보내되, 각 트래픽 채널별 데이터를 별도의 폴더에 저장하려고 합니다. 이렇게 하려면 다음과 같이 `channel` 열을 사용하여 데이터를 파티셔닝해야 합니다.

```
UNLOAD(SELECT user_id, ip_address, event, session_id, measure_name, time, 
query, quantity, product_id, channel 
FROM sample_clickstream.sample_shopping 
WHERE time BETWEEN ago(2d) AND now())  
TO 's3://<bucket_name>/partitionbychannel/' 
WITH (  
partitioned_by = ARRAY ['channel'], 
format='CSV',   
compression='GZIP')
```

## 이벤트별 데이터 파티셔닝
<a name="export-unload-example-sample-3"></a>

최근 이틀간의 데이터를 CSV 형식으로 내보내되, 각 이벤트별 데이터를 별도의 폴더에 저장하려고 합니다. 이렇게 하려면 다음과 같이 `event` 열을 사용하여 데이터를 파티셔닝해야 합니다.

```
UNLOAD(SELECT user_id, ip_address, channel, session_id, measure_name, time, 
query, quantity, product_id, event 
FROM sample_clickstream.sample_shopping 
WHERE time BETWEEN ago(2d) AND now())  
TO 's3://<bucket_name>/partitionbyevent/' 
WITH (  
partitioned_by = ARRAY ['event'], 
format='CSV',   
compression='GZIP')
```

## 채널과 이벤트별 데이터 파티셔닝
<a name="export-unload-example-sample-4"></a>

최근 이틀간의 데이터를 CSV 형식으로 내보내되, 각 채널별 데이터를 확보하고, 채널 내에서는 각 이벤트를 별도의 폴더에 저장하려고 합니다. 이렇게 하려면 다음과 같이 `channel` 열과 `event` 열을 모두 사용하여 데이터를 파티셔닝해야 합니다.

```
UNLOAD(SELECT user_id, ip_address, session_id, measure_name, time, 
query, quantity, product_id, channel,event 
FROM sample_clickstream.sample_shopping 
WHERE time BETWEEN ago(2d) AND now())  
TO 's3://<bucket_name>/partitionbychannelevent/' 
WITH (  
partitioned_by = ARRAY ['channel','event'], 
format='CSV',   
compression='GZIP')
```

## 매니페스트 및 메타데이터 파일
<a name="export-unload-example-manifest-metadata"></a>

### 매니페스트 파일
<a name="export-unload-common-questions-what-information-manifest"></a>

매니페스트 파일은 UNLOAD 실행 시 내보내지는 파일 목록에 대한 정보를 제공합니다. 매니페스트 파일은 파일 이름이 `S3://bucket_name/<queryid>_<UUID>_manifest.json`인 제공된 S3 버킷에 있습니다. 매니페스트 파일에는 결과 폴더 내 파일의 URL, 각 파일의 레코드 수 및 크기, 쿼리 메타데이터(쿼리에 대해 S3로 내보낸 총 바이트 수와 총 행 수)가 포함됩니다.

```
{
  "result_files": [
    {
        "url":"s3://my_timestream_unloads/ec2_metrics/AEDAGANLHLBH4OLISD3CVOZZRWPX5GV2XCXRBKCVD554N6GWPWWXBP7LSG74V2Q_1448466917_szCL4YgVYzGXj2lS.gz", 
        "file_metadata": 
            { 
                "content_length_in_bytes": 32295, 
                "row_count": 10 
            }
    },
    {
        "url":"s3://my_timestream_unloads/ec2_metrics/AEDAGANLHLBH4OLISD3CVOZZRWPX5GV2XCXRBKCVD554N6GWPWWXBP7LSG74V2Q_1448466917_szCL4YgVYzGXj2lS.gz", 
        "file_metadata": 
            { 
                "content_length_in_bytes": 62295, 
                "row_count": 20 
            }
    },
  ],
  "query_metadata": 
    {
      "content_length_in_bytes": 94590, 
      "total_row_count": 30,
      "result_format": "CSV",
      "result_version": "Amazon Timestream version 1.0.0"  
    },
  "author": {
        "name": "Amazon Timestream", 
        "manifest_file_version": "1.0" 
  }
}
```

### Metadata
<a name="export-unload-common-questions-what-information-metadata"></a>

메타데이터 파일은 데이터세트에 대한 열 이름, 열 유형, 스키마 등의 추가 정보를 제공합니다. 메타데이터 파일은 파일 이름이 S3://bucket\$1name/<queryid>\$1<UUID>\$1metadata.json인 제공된 S3 버킷에서 사용할 수 있습니다.

다음은 메타데이터 파일의 예제입니다.

```
{
    "ColumnInfo": [
        {
            "Name": "hostname",
            "Type": {
                "ScalarType": "VARCHAR"
            }
        },
        {
            "Name": "region",
            "Type": {
                "ScalarType": "VARCHAR"
            }
        },
        {
            "Name": "measure_name",
            "Type": {
                "ScalarType": "VARCHAR"
            }
        },
        {
            "Name": "cpu_utilization",
            "Type": {
                "TimeSeriesMeasureValueColumnInfo": {
                    "Type": {
                        "ScalarType": "DOUBLE"
                    }
                }
            }
        }
  ],
  "Author": {
        "Name": "Amazon Timestream", 
        "MetadataFileVersion": "1.0" 
  }
}
```

메타데이터 파일에 공유된 열 정보는 `SELECT` 쿼리에 대한 쿼리 API 응답에서 전송되는 `ColumnInfo`와 동일한 구조를 가집니다.

## Glue 크롤러를 사용하여 Glue Data Catalog 구축
<a name="export-unload-example-using-glue-crawlers"></a>

1. 다음 검증을 위해 관리자 자격 증명으로 계정에 로그인합니다.

1. [여기](https://docs.aws.amazon.com/glue/latest/ug/tutorial-add-crawler.html)에 제공된 지침에 따라 Glue 데이터베이스용 크롤러를 생성합니다. 데이터 소스에 제공될 S3 폴더는 `s3://my_timestream_unloads/results`와 같은 `UNLOAD` 결과 폴더여야 합니다.

1. [여기](https://docs.aws.amazon.com/glue/latest/ug/tutorial-add-crawler.html#tutorial-add-crawler-step2)의 지침에 따라 크롤러를 실행합니다.

1. Glue 테이블을 봅니다.
   + **AWS Glue** → **테이블**로 이동합니다.
   + 크롤러를 생성하는 동안 제공된 테이블 접두사로 생성된 새 테이블이 표시됩니다.
   + 테이블 세부 정보 보기를 클릭하여 스키마 및 파티션 정보를 볼 수 있습니다.

다음은 Glue 데이터 카탈로그를 AWS 사용하는 다른 AWS 서비스 및 오픈 소스 프로젝트입니다.
+ **Amazon Athena** - 자세한 내용은 Amazon Athena 사용 설명서의 [테이블, 데이터베이스, 데이터 카탈로그 이해](https://docs.aws.amazon.com/athena/latest/ug/understanding-tables-databases-and-the-data-catalog.html)를 참조하세요.
+ **Amazon Redshift Spectrum** - 자세한 내용은 Amazon Redshift 데이터베이스 개발자 안내서의 [Amazon Redshift Spectrum](https://docs.aws.amazon.com/redshift/latest/dg/c-using-spectrum.html)을 참조하세요.
+ **Amazon EMR** - 자세한 내용은 [Amazon EMR 관리 안내서의 AWS Glue 데이터 카탈로그에 대한 Amazon EMR 액세스에 리소스 기반 정책 사용을](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-iam-roles-glue.html) 참조하세요.
+ **AWS Apache Hive 메타스토어용 Glue 데이터 카탈로그 클라이언트** -이 GitHub 프로젝트에 대한 자세한 내용은 [AWS Apache Hive 메타스토어용 Glue 데이터 카탈로그 클라이언트](https://github.com/awslabs/aws-glue-data-catalog-client-for-apache-hive-metastore)를 참조하세요.

# Timestream for LiveAnalytics의 UNLOAD에 대한 제한
<a name="export-unload-limits"></a>

다음은 `UNLOAD` 명령과 관련된 제한입니다.
+ `UNLOAD` 문을 사용하는 쿼리의 동시성은 초당 쿼리(QPS) 1개입니다. 쿼리 속도를 초과하면 스로틀링이 발생할 수 있습니다.
+ `UNLOAD` 문을 포함하는 쿼리는 쿼리당 최대 100개의 파티션을 내보낼 수 있습니다. 선택한 열의 고유 개수를 확인한 후 내보낸 데이터를 파티셔닝하는 데 사용하는 것이 좋습니다.
+ `UNLOAD` 문을 포함하는 쿼리는 60분 후 시간 초과됩니다.
+ Amazon S3에서 `UNLOAD` 문이 생성하는 파일의 최대 크기는 78GB입니다.

Timestream for LiveAnalytics에 대한 기타 제한 사항은 [할당량기본 할당량](ts-limits.md) 섹션을 참조하세요.