Skip to content

파이썬을 사용한 Snowflake REST API에서 데이터 가져오기: 완전한 튜토리얼

Updated on

데이터 웨어하우징의 세계에서 Snowflake는 다양한 프로그래밍 언어와 호환되는 커넥터 풍부하게 제공하는 주요 플랫폼으로 등장했습니다. 이 중 하나가 언어에 구애받지 않으며 Snowflake 플랫폼과의 원활한 상호작용을 가능하게 하는 Snowflake REST API입니다. 본 문서는 인기있는 프로그래밍 언어인 파이썬을 사용하여 Snowflake REST API에서 데이터를 가져오는 포괄적인 가이드를 제공합니다.

데이터 로딩을 자동화하고, 데이터 통합을 위한 Snowflake REST API를 최적화하는 방법 등에 대해 자세히 알아보겠습니다.

Snowflake 데이터 시각화 (opens in a new tab)를 빠르게 원하시나요? RATH (opens in a new tab)를 확인해보세요!

RATH GitHub 링크: https://github.com/Kanaries/Rath (opens in a new tab)

Snowflake에 저장된 데이터를 손쉽게 정리하고 가져와 데이터 시각화를 빠르고 효율적으로 수행하며 복잡한 코딩없이 탐색적 데이터 분석을 수행할 수 있다면 어떨까요. 바로 RATH가 디자인된 기능입니다.

아래 비디오는 RATH의 데이터 페인터 (opens in a new tab) 기능을 사용하여 데이터에서 이상점을 신속하게 식별하는 방법을 보여줍니다:


관심이 있으신가요? 더 많은 고급 기능을 갖춘 RATH를 확인해보세요! RATH 웹사이트 (opens in a new tab)에서 자세한 내용을 확인하세요!

파트 1: Snowflake 및 REST API 이해하기

Snowflake는 대중적인 모든 프로그래밍 언어에서 표준인 다양한 커넥터를 제공하는 클라우드 기반 데이터 웨어하우징 플랫폼입니다. 이 중 하나는 프로그래밍 언어에 구애받지 않는 REST API입니다. 다양한 언어를 사용하여 REST API를 통해 Snowflake와 상호작용할 수 있으므로, 개발자들에게 유연한 선택지를 제공합니다.

REST API는 HTTP 요청을 Snowflake 서버로 보내고 HTTP 응답을 받음으로써 작동합니다. 이 상호작용을 통해 데이터 로딩, 데이터 쿼리, Snowflake 계정 관리 등 다양한 작업을 수행할 수 있습니다. 예를 들어, REST API를 사용하여 세션 인증, SQL 쿼리 발급, 쿼리 상태 모니터링, 쿼리 결과 검색 등을 할 수 있습니다.

파트 2: 파이썬과 Snowflake REST API 사용하기

파이썬은 데이터 분석, 머신러닝, 웹 개발 등 다양한 분야에서 널리 사용되는 강력한 프로그래밍 언어입니다. 그 간결함과 가독성은 개발자들 사이에서 인기를 끌고 있습니다. Snowflake의 REST API와 상호작용할 때 파이썬은 여러 가지 장점을 제공합니다.

첫째로, 파이썬은 HTTP 요청을 보내고 응답을 처리하는 과정을 단순화할 수 있는 다양한 라이브러리를 보유하고 있습니다. requestshttp.client와 같은 라이브러리는 이러한 작업을 쉽게 할 수 있는 기능을 제공합니다. 둘째로, 파이썬은 REST API와 함께 작업할 때 JSON(JavaScript Object Notation) 지원이 중요합니다. JSON은 API 요청 및 응답의 데이터 구조화에 흔히 사용되는 형식입니다.

Snowflake의 문맥에서 파이썬은 REST API에 SQL 쿼리를 보내고 응답을 처리하며 반환된 데이터를 조작하는 데 사용될 수 있습니다. 예를 들어, 파이썬을 사용하여 Snowflake에 SQL 쿼리를 보내고, JSON 형식으로 쿼리 결과를 검색한 다음 json 라이브러리를 사용하여 JSON 데이터를 구문 분석할 수 있습니다.

파트 3: 파이썬과 Snowflake REST API를 사용한 실전 예제

이제 파이썬을 사용하여 Snowflake의 REST API와 상호작용하는 실전 예제를 살펴보겠습니다. 이 예제에서는 세션 인증, SQL 쿼리 발급 및 쿼리 결과 검색과 같은 과정에 중점을 둘 것입니다.

먼저, 세션을 인증하기 위해 /session/v1/login-request 엔드포인트에 POST 요청을 보내야 합니다. 요청 본문에는 Snowflake 계정 정보 및 자격 증명이 포함되어야 합니다. 인증이 성공하면 토큰이 포함된 응답을 받으며, 이 토큰은 후속 API 요청에 사용됩니다.

다음으로, SQL 쿼리를 발급하기 위해 /queries/v1/query-request 엔드포인트로 POST 요청을 보낼 수 있습니다.

SQL 쿼리를 발급한 후에는 쿼리 ID와 성공 플래그를 포함하는 응답을 받게 됩니다. 성공 플래그는 시스템이 쿼리를 수락했는지 여부를 나타냅니다. 그러나 이 플래그는 쿼리의 실행 상태에 대한 정보는 제공하지 않습니다.

쿼리 상태를 확인하기 위해 /monitoring/queries/{query-id} 엔드포인트로 GET 요청을 보내면 됩니다. 이때 URL에 쿼리 ID를 전달합니다. 쿼리가 성공적으로 실행된 경우, 쿼리가 성공했음을 나타내는 응답을 받게 됩니다.

마지막으로, 쿼리 결과를 검색하기 위해 다시 /queries/v1/query-request 엔드포인트로 POST 요청을 보냅니다. 이번에는 요청 본문의 SQL 텍스트에 쿼리 ID를 전달합니다. 응답에는 data 객체의 rowset 필드에 쿼리 결과가 포함됩니다.

다음은 이러한 과정을 파이썬에서 어떻게 구현할 수 있는 간단한 예시입니다:

import requests
import json
 
## 세션 인증
auth_url = "https://{account}.{region}.snowflakecomputing.com/session/v1/login-request?warehouse={warehouse}"
auth_data = {
    "data": {
        "CLIENT_APP_ID": "lightweight-client",
        "CLIENT_APP_VERSION": "0.0.1",
        "ACCOUNT_NAME": "...",
        "LOGIN_NAME": "...",
        "PASSWORD": "..."
    }
}
auth_response = requests.post(auth_url, data=json.dumps(auth_data))
token = auth_response.json()["data"]["token"]
 
## SQL 쿼리 실행
query_url = "https://{account}.{region}.snowflakecomputing.com/queries/v1/query-request?requestId={random-uuid}"
query_headers = {"Authorization": f"Snowflake Token=\"{token}\""}
query_data = {
    "sqlText": "SELECT * FROM my_table",
    "asyncExec": True,
    "sequenceId": 1,
    "querySubmissionTime": 1635322866647
}
query_response = requests.post(query_url, headers=query_headers, data=json.dumps(query_data))
query_id = query_response.json()["data"]["queryId"]
 
## 쿼리 상태 확인
status_url = f"https://{account}.{region}.snowflakecomputing.com/monitoring/queries/{query_id}"
status_response = requests.get(status_url, headers=query_headers)
status = status_response.json()["data"]["queries"][0]["status"]
 
## 쿼리 결과 받아오기
if status == "SUCCESS":
    results_url = "https://{account}.{region}.snowflakecomputing.com/queries/v1/query-request?requestId={random-uuid}"
    results_data = {
        "sqlText": f"SELECT * FROM table(result_scan('{query_id}'))",
        "asyncExec": False,
        "sequenceId": 1,
        "querySubmissionTime": 1635066639000
    }
    results_response = requests.post(results_url, headers=query_headers, data=json.dumps(results_data))
    results = results_response.json()["data"]["rowset"]

이 예제는 Python을 사용하여 Snowflake의 REST API와 상호 작용하는 기본적인 프로세스를 보여줍니다. 그러나 이것은 단순화된 예제이며 실제 구현에는 추가적인 오류 처리 및 기타 사항이 필요할 수 있습니다.

파트 4: 큰 결과 세트 처리

대량의 데이터 세트를 처리할 때 Snowflake의 REST API에서 반환된 페이로드에는 rowset 배열에 행이 포함되지 않을 수 있습니다. 대신, chunkHeaderschunks가 포함되어 있습니다. 이러한 청크는 S3에서 안전하게 오프로드된 암호화된 개체로, 다운로드할 준비가 되어 있습니다. 이 객체들은 rowset와 동일한 JSON 형식을 가지고 있습니다.

Python에서 큰 결과 세트를 처리하는 방법은 다음과 같습니다.

## 응답에 청크가 포함되어 있는지 확인
if "chunks" in results_response.json()["data"]:
    chunks = results_response.json()["data"]["chunks"]
    chunk_headers = results_response.json()["data"]["chunkHeaders"]
 
    ## 각 청크를 다운로드하고 복호화
    for chunk in chunks:
        chunk_url = chunk["url"]
        chunk_response = requests.get(chunk_url, headers=chunk_headers)
        chunk_data = chunk_response.json()
 
        ## 청크 데이터 처리
        for row in chunk_data["rowset"]:
            process_row(row)

이 코드는 응답에 청크가 포함되어 있는지 확인합니다. 청크가 포함되어 있다면 각 청크를 다운로드하고 복호화한 다음, 각 청크의 데이터를 처리합니다.

파트 5: 데이터 로딩을 위한 Snowpipe REST API 사용

Snowpipe는 Snowflake가 데이터 웨어하우스로 데이터를로드하기 위해 제공하는 서비스입니다. 데이터가 클라우드 기반 스토리지에 도착하자마자 데이터를 로드하기 위해 설계되었습니다. Snowpipe는 Snowflake REST API를 사용하므로 데이터 로딩 프로세스를 자동화할 수 있습니다.

Python을 사용하여 Snowpipe REST API와 상호 작용하는 기본적인 예는 다음과 같습니다.

## Snowpipe REST API URL 정의
snowpipe_url = "https://{account}.{region}.snowflakecomputing.com/v1/data/pipes/{pipe_name}/insertFiles"
 
## 요청 헤더 정의
headers = {
    "Authorization": f"Snowflake Token=\"{token}\"",
    "Content-Type": "application/json"
}
 
## 요청 본문 정의
body = {
    "files": [
        "s3://my-bucket/my-file.csv"
    ]
}
 
## 요청을 Snowpipe REST API로 보냅니다.
response = requests.post(snowpipe_url, headers=headers, data=json.dumps(body))
 
## 응답 확인
if response.status_code == 200:
    print("데이터 로딩이 성공적으로 시작되었습니다.")
else:
    print(f"데이터 로딩을 시작하지 못했습니다: {response.json()['message']}")

이 코드는 요청을 Snowpipe REST API로 보내어 S3 버킷의 지정된 파일에서 데이터 로딩을 시작합니다. Snowpipe REST API의 응답은 데이터 로딩 프로세스가 성공적으로 시작되었는지 여부를 나타냅니다.

결론

결론적으로, Python을 사용하여 Snowflake REST API에서 데이터를 가져오는 것은 Snowflake와 Python의 기능을 활용하는 강력한 방법입니다. 데이터 로딩, 데이터 쿼리 또는 Snowflake 계정 관리와 같은 작업을 수행하는 경우 Python은 Snowflake의 REST API와 상호 작용하는 강력하고 유연한 방법을 제공합니다. 이 문서에서 제공되는 실용적인 예시와 FAQ를 통해 Snowflake REST API 및 Python을 시작하는 데 필요한 충분한 이해를 갖게 될 것입니다. 즐거운 코딩 하세요!

FAQ

Python에서 Snowflake에서 데이터를 가져오는 방법은 무엇인가요?

Python에서 Snowflake에서 데이터를 가져오려면 Snowflake Python 커넥터 또는 Snowflake REST API를 사용할 수 있습니다. Python 커넥터를 사용하면 Python의 데이터베이스 API 사양 (PEP 249)을 사용하여 Snowflake와 상호 작용할 수 있으며, REST API를 사용하면 HTTP 요청을 보내서 Snowflake에서 다양한 작업을 수행할 수 있습니다.

Snowflake은 API에서 데이터를 가져올 수 있나요?

네, Snowflake은 외부 함수를 사용하여 API에서 데이터를 가져올 수 있습니다. 이러한 함수를 사용하면 Snowflake에서 외부 API를 호출하여 쿼리 중에 데이터를 검색할 수 있습니다. 또한 Snowflake의 REST API를 사용하여 데이터 로딩 및 데이터 쿼리와 같은 작업을 수행할 수 있습니다.

Python에서 Snowflake API 연결은 무엇인가요?

파이썬에서 Snowflake API 연결은 파이썬 애플리케이션과 Snowflake 간에 Snowflake Python 연결자 또는 Snowflake REST API를 사용하여 수립된 연결을 말합니다. 이 연결을 통해 파이썬 애플리케이션은 Snowflake와 상호작용하여 데이터 로딩, 데이터 쿼리 및 계정 관리와 같은 작업을 수행할 수 있습니다.