프로젝트를 진행하면서 snowflake를 활용하여 데이터 웨어하우스 구축에 사용했던 것들을 모아서 정리하였습니다.

Colab을 활용하여 snowflake조작하기

: snowflake에 데이터를 colab으로 넣을 수 없을까 생각하다가 찾았던 라이브러리이다. 그러나 실사용에서는 snowflake의 웹을 통해서 넣는 것이 편해 잘 사용되지는 않았다.

  • 설치
%pip install snowflake-connector-python
import snowflake.connector

 

  •  계정 정보를 입력해서 연결 수행
ctx = snowflake.connector.connect(
    user='<user_name>',
    password='<password>',
    account='<account_name>'
    )
cs = ctx.cursor()
try:
    cs.execute("SELECT current_version()")
    one_row = cs.fetchone()
    print(one_row[0])
finally:
    cs.close()
ctx.close()
  • SQL 입력
cs.cusor().execute(query)

 

추가 정보는 다음 블로그를 참고 : Snowflake Python에서 사용하는 법(Python Connector, Snowpark)

S3와 연결

: 연결과정의 경우 블로그의 글을 참고하며, 실제로 사용하였고, 동작한 코드위주로 정리글을 남긴다.

클라우드와 s3를 연결하기위해서는 3가지의 과정이 필요하다.

Integration → staging → COPY INTO

IAM Policy 구성

: S3폴더에 액세스 하려면 몇가지 권한이 필요하다.

  • s3:GetBucketLocation
  • s3:GetObject
  • s3:GetObjectVersion
  • s3:ListBucket
  • s3:PutObject
  • s3:DeleteObject

JSON코드로 정책을 생성하면 다음과 같다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
              "s3:PutObject",
              "s3:GetObject",
              "s3:GetObjectVersion",
              "s3:DeleteObject",
              "s3:DeleteObjectVersion"
            ],
            "Resource": "arn:aws:s3:::<bucket>/<prefix>/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::<bucket>",
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "<prefix>/*"
                    ]
                }
            }
        }
    ]
}

에는 권한을 갖는 s3버킷을 입력하고, 에는 오브젝트의 경로를 입력한다.

Integration

: 클라우드의 키나 액세스 토큰같은 자격 증명을 전달하지 않고도 연결을 수행하게 해주는 개체이다. 이를 이용하면 자격 증명 정보를 코드에 넣지 않고도 클라우드와의 연결이 가능해진다.

-- integration
CREATE STORAGE INTEGRATION s3_connect
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'S3'
  ENABLED = TRUE
  STORAGE_AWS_ROLE_ARN = '<aws_role_arn>'
  STORAGE_ALLOWED_LOCATIONS = ('<s3_bucket_location>');

STAGING

: 파일을 snowflake로 로드하기 전에 임시로 저장하는 영역을 생성한다. 종류는 사용자, 테이블, 외부 stage가 있다.

-- staging
USE SCHEMA DATABASE_PROJECT.RAW_DATA;

CREATE STAGE my_s3_stage
  STORAGE_INTEGRATION = s3_connect
  URL = '<s3_bucket_location>';

COPY INTO

  • load
-- 로드
COPY INTO SCHEMA.TABLE_NAME
FROM <파일 경로>
FILE_FORMAT = (TYPE = CSV SKIP_HEADER = 1); --첫 줄의 헤더를 스킵하는 포맷
  • unload
-- CSV 형식으로 언로드
COPY INTO @my_ext_unload_stage/TABLE_NAME
FROM TABLE_NAME
FILE_FORMAT = (TYPE = 'CSV' FIELD_OPTIONALLY_ENCLOSED_BY = '"' FIELD_DELIMITER = ',' COMPRESSION = 'NONE');
-- SINGLE = TRUE; single로 하게되면 파일 하나로 언로드된다.

참고 및 출처) Amazon S3에 액세스하도록 Snowflake 설정하기

'Others > Cloud' 카테고리의 다른 글

Cloud - Snowflake(1) 소개  (0) 2024.03.18
Cloud - Redshift 보안, Spectrum, ML, 중지  (0) 2024.03.15
Cloud - Redshift & S3 connect  (0) 2024.03.15

+ Recent posts