【AWS】 S3 Select에서 S3 파일에서 필요한 데이터를 검색하여 취득

5951 단어 파이썬S3S3SELECT

하고 싶은 일



S3 Select를 사용하여 S3 파일을 SQL 쿼리로 검색하여 필요한 레코드를 얻고 싶습니다.


즐거운 일


  • S3의 파일로부터 대상 데이터를 바꾸어 조사하고 싶을 때에 편리.
  • 쿼리를 검색하려면 데이터베이스에 넣어야했지만 필요하지 않습니다.
  • API Gateway나 Lambda등과 조합하는 것으로, S3의 데이터에 대한 서버리스인 어플리케이션을 구축할 수 있다.

  • S3 Select 포인트


  • S3 상의 1 파일을 대상으로 하고 있다.
  • 파일 형식은 CSV, JSON, Apache Parquet 형식에 해당합니다.
  • GZIP, BZIP2의 압축 형식에 대응하고 있다.
  • AWS SDK 및 AWS CLI의 SQL 쿼리도 지원합니다.
  • 요금은 「스캔한 데이터량+반환한 데이터량」으로의 과금이 되므로, 대상이 되는 파일은 압축해 두는 것이 좋다.

  • S3의 콘솔 화면에서 조작해보기



    이번에는 다음 형식의 샘플 파일을 S3에 배치하여 검증합니다.

    sample.tsv
    male    14  student
    female  26  employee
    male    32  selfemployed
    male    45  unemployed
    female  11  student
    male    24  employee
    male    33  selfemployed
    male    49  unemployed
    female  57  unemployed
    

    S3 콘솔 화면에서 대상 파일을 선택하고 S3 Select 탭을 선택합니다.


    파일 형식: CSV
    구분 기호: 탭
    압축: 없음
    "다음"


    실행할 SQL을 입력합니다.
    첫 번째 열이 "female"의 레코드를 얻고 싶습니다.

    SQL
    select * from s3object s where s._1 = 'female'
    


    제대로 얻을 수 있었습니다.
    "다운로드"를하면 CSV 파일로 다운로드할 수 있습니다.

    샘플 SQL이 몇 가지 있으므로 시도해보십시오.


    EC2 인스턴스에서 Python으로 SQL 쿼리 실행



    EC2 인스턴스에서 Python에서 SQL 쿼리를 실행하는 패턴도 시도해 보겠습니다.
    먼저 필요한 Python을 설치합니다.
    # Python3をインストール
    $ sudo yum update -y
    $ sudo yum install python3 -y
    
    # 仮想環境の有効化
    $ python3 -m venv ~/s3select_example/env
    $ source ~/s3select_example/env/bin/activate
    
    # boto3をインストール
    $ pip install pip --upgrade
    $ pip install boto3
    

    그런 다음 Python 파일을 만듭니다.

    S3Select.py
    import boto3
    
    s3 = boto3.client('s3')
    
    resp = s3.select_object_content(
        Bucket='my-bucket.01',
        Key='sample/sample.tsv',
        ExpressionType='SQL',
        Expression="SELECT * FROM s3object s where s._1 = 'female'",
        InputSerialization = {'CSV': {"FileHeaderInfo": "NONE", 'FieldDelimiter': '\t'}, 'CompressionType': 'NONE'},
        OutputSerialization = {'CSV': {}},
    )
    
    for event in resp['Payload']:
        if 'Records' in event:
            records = event['Records']['Payload'].decode('utf-8')
            print(records)
    
    

    Bucket과 Key는 S3의 읽어들이는 파일에 맞추어 주세요.
    그리고, 이번 대상 파일이 탭 단락이므로, InputSerialization의 FieldDelimiter에는 「'\t'」를 지정하고 있습니다.

    그럼 실행해 보겠습니다.
    $ python S3Select.py
    
    female,26,employee
    female,11,student
    female,57,unemployed
    

    콘솔 화면에서 실행한 결과와 같은 레코드가 출력되었습니다!

    이번에는 S3의 파일을 SQL 쿼리로 직접 검색하여 대상 레코드를 가져 왔습니다.
    S3의 파일에 대해서 조사를 실시하는 일이 있거나 하기 때문에, 기회가 있으면 사용해 가고 싶습니다.

    참고 : htps : // 아 ws. 아마존. 코 m / jp / b ぉ gs / 네 ws / 쿠에리 ぃ g ー ー ー ぃ お t せ r ゔ ぇ rs ー r 세 ct /

    좋은 웹페이지 즐겨찾기