Snowflake Python APIs ์„ ์‚ฌ์šฉํ•˜์—ฌ Snowflake์— ์—ฐ๊ฒฐยถ

Snowflake Python APIs ์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋จผ์ € Snowflake์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•˜๋ฉด API์—์„œ ๋ชจ๋ธ๋งํ•œ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ Root ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ ์†์„ฑ ์ง€์ •ํ•˜๊ธฐยถ

๋‹ค์Œ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Snowflake์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Python ์‚ฌ์ „์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐํ•˜๊ธฐยถ

Python ์‚ฌ์ „์„ ์‚ฌ์šฉํ•˜์—ฌ Snowflake์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐํ•  ๋•Œ ์ด ์‚ฌ์ „์„ ์—ฐ๊ฒฐ์— ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์ธ์ž๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

import os

CONNECTION_PARAMETERS = {
    "account": os.environ["snowflake_account_demo"],
    "user": os.environ["snowflake_user_demo"],
    "password": os.environ["snowflake_password_demo"],
    "role": "test_role",
    "database": "test_database",
    "warehouse": "test_warehouse",
    "schema": "test_schema",
}
Copy

๊ตฌ์„ฑ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐํ•˜๊ธฐยถ

TOML ๊ตฌ์„ฑ ํŒŒ์ผ ์—์„œ ์—ฐ๊ฒฐ ์ •์˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ์—์„œ Snowflake์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

TOML ๊ตฌ์„ฑ ํŒŒ์ผ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์„ค์ •์€ Snowsight ์—์„œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํด๋ผ์ด์–ธํŠธ, ๋“œ๋ผ์ด๋ฒ„, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ์„œ๋“œ ํŒŒํ‹ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Snowflake์— ์—ฐ๊ฒฐํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜๊ธฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์—ฐ๊ฒฐ ์„ค์ •์„ ์ˆ˜๋™์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ~/.snowflake/connections.toml ์— ์žˆ๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ์—ฐ๊ฒฐ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

[myconnection]
account = "test-account"
user = "test_user"
password = "******"
role = "test_role"
warehouse = "test_warehouse"
database = "test_database"
schema = "test_schema"
Copy

์ด ์˜ˆ์ œ์—์„œ๋Š” ๊ณ„์ • test-account, ์‚ฌ์šฉ์ž test_user, ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž๊ฒฉ์ฆ๋ช… ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •๋ณด๋กœ ์ด๋ฆ„์ด myconnection ์ธ Snowflake ์—ฐ๊ฒฐ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๋ฐ‘์ค„์€ account ์„ค์ •์—์„œ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณ„์ • ์‹๋ณ„์ž ์— ๋ฐ‘์ค„์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ๋Œ€์‹œ๋กœ ๋ฐ”๊พธ์‹ญ์‹œ์˜ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์กฐ์ง์˜ ๊ณ„์ • ์ด๋ฆ„ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์—ฐ๊ฒฐ ์ •์˜๋Š” Snowflake Python ์ปค๋„ฅํ„ฐ ์—์„œ ์ œ๊ณต๋˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ตฌ์„ฑ ์˜ต์…˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Root ์˜ค๋ธŒ์ ํŠธ ์—ฐ๊ฒฐ ๋ฐ ์ƒ์„ฑํ•˜๊ธฐยถ

์ง€์ •ํ•œ ์—ฐ๊ฒฐ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ Snowflake์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์„ ํ†ตํ•ด API ์‚ฌ์šฉ์„ ์‹œ์ž‘ํ•  Snowflake Python APIs Root ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ค๋ธŒ์ ํŠธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Snowpark Session ๊ณผ ์—ฐ๊ฒฐํ•˜๊ธฐยถ

Python์šฉ Snowpark API ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น snowflake.snowpark.Session ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Snowflake์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Snowpark Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” snowflake.core ์˜ ์ข…์†์„ฑ์œผ๋กœ ์ž๋™ ์„ค์น˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Snowpark Session ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Snowflake์— ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค.

  1. snowflake-snowpark-python ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    pip install 'snowflake-snowpark-python>=1.5.0,<2.0.0'
    
    Copy
  2. Snowflake์— ์—ฐ๊ฒฐ์„ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ ์˜ˆ์ œ์™€ ์œ ์‚ฌํ•œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    from snowflake.core import Root
    from snowflake.snowpark import Session
    
    session = Session.builder.config("connection_name", "myconnection").create()
    root = Root(session)
    
    Copy

    ์ด ์˜ˆ์ œ์˜ ์ฝ”๋“œ๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์— ์ง€์ •๋œ myconnection ์ด๋ผ๋Š” ์—ฐ๊ฒฐ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Session ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ์—์„œ๋Š” ๊ฒฐ๊ณผ Session ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API๋ฅผ ์‚ฌ์šฉํ•  Root ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Session ์ƒ์„ฑ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Snowpark Python ์„ธ์…˜ ๋งŒ๋“ค๊ธฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

Python ์ปค๋„ฅํ„ฐ Connection ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐยถ

Python์šฉ Snowflake ์ปค๋„ฅํ„ฐ ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น snowflake.connector.connect ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Snowflake์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” Connection ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Python Connector ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณ„๋„๋กœ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. snowflake ์ƒ์œ„ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ฉด snowflake-connector-python ํŒจํ‚ค์ง€๊ฐ€ ์ข…์†์„ฑ์œผ๋กœ ์ž๋™ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์ œ์˜ ์ฝ”๋“œ๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์— ์ง€์ •๋œ myconnection ์ด๋ผ๋Š” ์—ฐ๊ฒฐ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Connection ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ์—์„œ๋Š” ๊ฒฐ๊ณผ Connection ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API๋ฅผ ์‚ฌ์šฉํ•  Root ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

from snowflake.connector import connect
from snowflake.core import Root

connection = connect(connection_name="myconnection")
root = Root(connection)
Copy

Python์šฉ Snowflake ์ปค๋„ฅํ„ฐ API์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Python ์ปค๋„ฅํ„ฐ API ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

Root ์˜ค๋ธŒ์ ํŠธ ์‚ฌ์šฉํ•˜๊ธฐยถ

Snowflake ์—ฐ๊ฒฐ์—์„œ ์ƒ์„ฑ๋œ Root ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Snowflake Python APIs ์˜ ์˜ค๋ธŒ์ ํŠธ์™€ ๋ฉ”์„œ๋“œ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Root ์˜ค๋ธŒ์ ํŠธ๋Š” API์—์„œ ๋ชจ๋ธ๋งํ•œ ๋ฆฌ์†Œ์Šค ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ์ž…๋‹ˆ๋‹ค. Root ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API๋กœ ํ‘œ์‹œ๋˜๋Š” Snowflake ์˜ค๋ธŒ์ ํŠธ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์ œ์˜ ์ฝ”๋“œ์—์„œ๋Š” mytask ๋ผ๋Š” ์ž‘์—…์„ ์žฌ๊ฐœํ•˜๊ธฐ ์œ„ํ•ด Root ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Snowflake ์˜ค๋ธŒ์ ํŠธ์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์€ mydb ๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์žˆ๋Š” myschema ๋ผ๋Š” ์Šคํ‚ค๋งˆ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ์—์„œ๋Š” databases, schemas ๋ฐ tasks ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ž‘์—…์„ ๋‚˜ํƒ€๋‚ด๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

tasks = root.databases["mydb"].schemas["myschema"].tasks
mytask = tasks["mytask"]
mytask.resume()
Copy