Snowpark Python에서 함수 및 저장 프로시저 호출하기

DataFrame에서 데이터를 처리하기 위해 시스템 정의 SQL 함수, 사용자 정의 함수, 저장 프로시저를 호출할 수 있습니다. 이 항목에서는 Snowpark에서 이를 호출하는 방법에 대해 설명합니다.

이 항목의 내용:

DataFrame에서 데이터를 처리하기 위해 시스템 정의 SQL 함수, 사용자 정의 함수, 저장 프로시저를 호출할 수 있습니다.

시스템 정의 함수 호출하기

시스템 정의 SQL 함수 를 호출해야 하는 경우, snowflake.snowpark.functions 모듈에서 이와 동일한 함수를 사용하십시오.

다음 예에서는 functions 모듈의 upper 함수(시스템 정의 UPPER 함수와 동일)를 호출하여 대문자로 된 sample_product_data 테이블의 이름 열에 있는 값을 반환합니다.

>>> # Import the upper function from the functions module.
>>> from snowflake.snowpark.functions import upper, col
>>> session.table("sample_product_data").select(upper(col("name")).alias("upper_name")).collect()
[Row(UPPER_NAME='PRODUCT 1'), Row(UPPER_NAME='PRODUCT 1A'), Row(UPPER_NAME='PRODUCT 1B'), Row(UPPER_NAME='PRODUCT 2'), Row(UPPER_NAME='PRODUCT 2A'), Row(UPPER_NAME='PRODUCT 2B'), Row(UPPER_NAME='PRODUCT 3'), Row(UPPER_NAME='PRODUCT 3A'), Row(UPPER_NAME='PRODUCT 3B'), Row(UPPER_NAME='PRODUCT 4'), Row(UPPER_NAME='PRODUCT 4A'), Row(UPPER_NAME='PRODUCT 4B')]
Copy

함수 모듈에서 시스템 정의 SQL 함수를 사용할 수 없는 경우, 다음 접근 방식 중 하나를 사용할 수 있습니다.

  • call_function 함수를 사용하여 시스템 정의 함수를 호출합니다.

  • function 함수를 사용하여 시스템 정의 함수를 호출하는 데 사용할 수 있는 함수 오브젝트를 만듭니다.

call_functionfunctionsnowflake.snowpark.functions 모듈에 정의되어 있습니다.

call_function 의 경우, 시스템 정의 함수의 이름을 첫 번째 인자로 전달합니다. 열 값을 시스템 정의 함수에 전달해야 하는 경우, Column 오브젝트를 정의하고 call_function 함수에 대한 추가 인자로서 전달하십시오.

다음 예에서는 시스템 정의 함수 RADIANS 를 호출하여 col1 열의 값을 전달합니다.

>>> # Import the call_function function from the functions module.
>>> from snowflake.snowpark.functions import call_function
>>> df = session.create_dataframe([[1, 2], [3, 4]], schema=["col1", "col2"])
>>> # Call the system-defined function RADIANS() on col1.
>>> df.select(call_function("radians", col("col1"))).collect()
[Row(RADIANS("COL1")=0.017453292519943295), Row(RADIANS("COL1")=0.05235987755982988)]
Copy

call_function 함수는 DataFrame 변환 메서드 (예: filter, select 등)에 전달할 수 있는 Column 을 반환합니다.

function 의 경우, 시스템 정의 함수의 이름을 전달하고, 반환된 함수 오브젝트를 사용하여 시스템 정의 함수를 호출합니다. 예:

>>> # Import the call_function function from the functions module.
>>> from snowflake.snowpark.functions import function

>>> # Create a function object for the system-defined function RADIANS().
>>> radians = function("radians")
>>> df = session.create_dataframe([[1, 2], [3, 4]], schema=["col1", "col2"])
>>> # Call the system-defined function RADIANS() on col1.
>>> df.select(radians(col("col1"))).collect()
[Row(RADIANS("COL1")=0.017453292519943295), Row(RADIANS("COL1")=0.05235987755982988)]
Copy

사용자 정의 함수(UDF) 호출하기

이름으로 등록한 UDF, 그리고 CREATEFUNCTION 을 실행하여 만든 UDF를 호출하려면 snowflake.snowpark.functions 모듈에서 call_udf 함수를 사용하십시오. UDF의 이름을 첫 번째 인자로서 전달하고 모든 UDF 매개 변수를 추가 인자로서 전달하십시오.

다음 예에서는 UDF 함수 minus_one 을 호출하여 col1col2 열의 값을 전달합니다. 이 예에서는 minus_one 의 반환 값을 DataFrame의 select 메서드로 전달합니다.

>>> # Import the call_udf function from the functions module.
>>> from snowflake.snowpark.functions import call_udf

>>> # Runs the scalar function 'minus_one' on col1 of df.
>>> df = session.create_dataframe([[1, 2], [3, 4]], schema=["col1", "col2"])
>>> df.select(call_udf("minus_one", col("col1"))).collect()
[Row(MINUS_ONE("COL1")=0), Row(MINUS_ONE("COL1")=2)]
Copy

사용자 정의 테이블 함수(UDTF) 호출하기

이름으로 등록한 UDTF와 CREATE FUNCTION을 실행하여 만든 UDTF를 호출하려면 아래 나열된 함수 중 하나를 사용하십시오. 둘 다 지연 평가된 관계형 데이터 세트를 나타내는 DataFrame 을 반환합니다.

이 두 가지 UDTF를 사용하여 시스템 정의 테이블 함수 를 비롯한 다른 테이블 함수도 호출할 수 있습니다.

UDTF 등록에 대한 자세한 내용은 UDTF 등록하기 섹션을 참조하십시오.

  • 측면 조인을 지정하지 않고 UDTF를 호출하려면 snowflake.snowpark.Session 클래스에서 table_function 함수를 호출하십시오.

    함수 참조와 예제는 Session.table_function 을 참조하십시오.

    다음 예제의 코드는 table_function 을 사용하여 udtf 함수로 등록된 generator_udtf 함수를 호출합니다.

    >>> from snowflake.snowpark.types import IntegerType, StructField, StructType
    >>> from snowflake.snowpark.functions import udtf, lit
    >>> class GeneratorUDTF:
    ...     def process(self, n):
    ...         for i in range(n):
    ...             yield (i, )
    >>> generator_udtf = udtf(GeneratorUDTF, output_schema=StructType([StructField("number", IntegerType())]), input_types=[IntegerType()])
    >>> session.table_function(generator_udtf(lit(3))).collect()
    [Row(NUMBER=0), Row(NUMBER=1), Row(NUMBER=2)]
    
    Copy
  • 호출에서 측면 조인을 지정하는 UDTF를 호출하려면 snowflake.snowpark.DataFrame 클래스에서 join_table_function 함수를 사용하십시오.

    UDTF를 측면 조인할 때 PARTITION BY 및 ORDER BY 절을 지정할 수 있습니다.

    함수 참조와 예제는 DataFrame.join_table_function 을 참조하십시오.

    다음 예제의 코드는 측면 조인을 수행하여 partition_byorder_by 매개 변수를 지정합니다. 이 예제의 코드는 먼저 snowflake.snowpark.functions.table_function 함수를 호출하여 시스템 정의 SPLIT_TO_TABLE 함수를 나타내는 함수 오브젝트를 만듭니다. 그런 다음 join_table_function 이 호출하는 것은 이 함수 오브젝트입니다.

    snowflake.snowpark.functions.table_function 함수 참조는 table_function 을 참조하십시오. SPLIT_TO_TABLE 함수 참조는 SPLIT_TO_TABLE 섹션을 참조하십시오.

    >>> from snowflake.snowpark.functions import table_function
    >>> split_to_table = table_function("split_to_table")
    >>> df = session.create_dataframe([
    ...     ["John", "James", "address1 address2 address3"],
    ...     ["Mike", "James", "address4 address5 address6"],
    ...     ["Cathy", "Stone", "address4 address5 address6"],
    ... ],
    ... schema=["first_name", "last_name", "addresses"])
    >>> df.join_table_function(split_to_table(df["addresses"], lit(" ")).over(partition_by="last_name", order_by="first_name")).show()
    ----------------------------------------------------------------------------------------
    |"FIRST_NAME"  |"LAST_NAME"  |"ADDRESSES"                 |"SEQ"  |"INDEX"  |"VALUE"   |
    ----------------------------------------------------------------------------------------
    |John          |James        |address1 address2 address3  |1      |1        |address1  |
    |John          |James        |address1 address2 address3  |1      |2        |address2  |
    |John          |James        |address1 address2 address3  |1      |3        |address3  |
    |Mike          |James        |address4 address5 address6  |2      |1        |address4  |
    |Mike          |James        |address4 address5 address6  |2      |2        |address5  |
    |Mike          |James        |address4 address5 address6  |2      |3        |address6  |
    |Cathy         |Stone        |address4 address5 address6  |3      |1        |address4  |
    |Cathy         |Stone        |address4 address5 address6  |3      |2        |address5  |
    |Cathy         |Stone        |address4 address5 address6  |3      |3        |address6  |
    ----------------------------------------------------------------------------------------
    
    Copy

저장 프로시저 호출

저장 프로시저를 호출하려면 Session 클래스의 호출 메서드를 사용하십시오.

>>> session.call("your_proc_name", 1)  
 0
Copy