본문 바로가기
Python

Python - AWS S3 Select 와 Atena 차이점, 기본 사용법

by 올엠 2024. 3. 7.
반응형

AWS를 이용하면 S3에 저장되어 있는 데이터를 확인해야 한 경우가 종종 발생한다.

이띠, Atena와 Select를 이용해서 S3에 저장되어 있는 자료를 검색해 부분적으로 가져올 수 있는 기능을 통해 원하는 자료만 빠르게 검색할 수 있다.

먼저 S3 Select와 Atena의 기본적이 차이를 알아보도록 하자.

S3 Select 와 Atena 차이점

AWS Select: 가장 비용을 효율적으로 원하는 S3와 Glacier 에서 데이터를 검색할 수 있는 방법이다.

AWS Athena: ANSI SQL 방식으로 완전한 SQL 쿼리를 사용할 수 있다. - group by, having, window, geo in SQL DDL and DML등 

따라서 검색 위주로 사용하는 경우 S3 Select, Atena는 SQL 데이터를 통해 통계나 Join 구문 등을 고급 쿼리 구현시 유리하다.

만약 SQL시 데이터 검색을 위해 사용한다면 Select가 좋은 선택이 될 수 있다. 아래 문서에서 Select 관련 세부적인 내용을 확인 할 수 있다.

https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/s3-glacier-select-sql-reference-select.html

S3 Select Glacier 이용하기 위해서는 Glacier Valut 라는 별도 서비스에 데이터를 저장해 두어야하고, Glacier Valut에서 검색한 내용을 S3로 내보내기 가능하다.(2022년 3월 기준)

AWS Select 제한 사항

AWS Select 를 이용해서 쿼리를 진행할 때 모두 가능한 것은 아니며, 아래와 같은 파일에 대해서 지원한다.

한줄로 얘기하자면, Linux 기준으로 압축을 해제하지 않고 파일을 검색할 수 있는 조건의 파일은 가능하다고 할 수 있다.

AWS Select 지원 형태

Text형태의 파일(CSV): 줄바꿈이나, 콤마를 기준으로 구분

리눅스 로그, audit.log, csv 형태의 파일

JSON 형태의 파일: {"key":"value"} 

클라우드 및 키, 데이터 기준으로 제공

Bzip, Gzip 형태의 Text, JSON 파일: Bzip, Gzip

gz 확장자, bz 확장자

그리고 AWS Select에서 사용할 수 있는 주요 파라미터는 다음과 같다.

Bucket 버킷 이름을 지정한다.

Key 버킷 내 Object로 S3의 경로가 여기에 포함된다.

ExpressionType Select를 사용하는 언어 타입을 지정 'SQL'로 지정해 사용이 가능하다.

Expression 실제 쿼리가 들어가는 파라미터이다. 

InputSerialization 입력값의 구조를 설정한다.

  • FileHeaderInfo: CSV 파일의 경우 보통 첫 라인이 헤더로 구성된 경우가 있다. 이때 FileHeaderInfo를 True나 False로 설정할 수 있다. 
  • RecordDelimiter: 만약 줄바꿈을 통해서 하나의 데이터로 인식시키고자 한다면, 'RecordDelimiter'를 '\n'으로 설정하도록 하자.
  • FieldDelimiter: 필드의 구분이 없는 Text 이면, 'FieldDelimiter'를 제거하고, 콤마나 공백등으로 필드를 구분하는 CSV형식이라면 'FieldDelimiter'를 통해 구분자를 넣어주자.
  • CompressionType: 'CompressionType'는 파일 압축 유무에 따라서 'NONE', 'GZIP', 'BZIP2' 를 설정한다.

https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Types/InputSerialization.html 에서 보다 많은 옵션을 확인할 수 있다.

OutputSerialization 결과 값을 출력하는 구조을 설정한다. InputSerialization 과 동일하게 지정할 수 있다.

https://docs.aws.amazon.com/AmazonS3/latest/API/API_OutputSerialization.html 를 참고하기 바란다.

사용법

Python을 통한 기본적인 사용법은 다음과 같다.

CSV, Text 파일 형태

Text파일 형태를 작업할 때에는 RecordDelimiter와 FieldDelimiter를 지정해 주어서 활용할 수 있다.

import boto3

Input =  { 'CSV': {
                'FileHeaderInfo': None,
                'RecordDelimiter': '\n',
                'FieldDelimiter': ','
            },
                'CompressionType': None
            }

s_client = boto3.client('s3')

resp = s_client.select_object_content(
        Bucket=s_bucket,
        Key=s_prefix,
        ExpressionType='SQL',
        Expression="SELECT * FROM s3object LIMIT 5",
        InputSerialization = Input,
        OutputSerialization = { 'JSON':
            {
                'RecordDelimiter': ','
            }
        }
    )

for item in resp['Payload']:
    if 'Records' in item:
        print(item)

 

JSON 파일 형태

JSON의 경우 Key, Value 구분이 명확하기 때문에 보다 편리하게 쿼리가 가능하다.

import boto3


Input =  {'JSON': {
                'Type': "LINES"
            },
                'CompressionType': None
    }



s_client = boto3.client('s3')

resp = s_client.select_object_content(
        Bucket=s_bucket,
        Key=s_prefix,
        ExpressionType='SQL',
        Expression="SELECT * FROM s3object LIMIT 5",
        InputSerialization = Input,
        OutputSerialization = { 'JSON':
            {
                'RecordDelimiter': ','
            }
        }
    )
 
반응형