Python UDF 소개¶
이 항목에서는 Python UDF를 소개하고 Python UDF 사용 시기를 결정하는 데 도움이 되는 정보를 제공합니다.
이 항목의 내용:
Python UDF란 무엇입니까?¶
UDF(사용자 정의 함수)는 기본 제공 함수를 호출하는 것과 같은 방식으로 Snowflake에서 호출할 수 있는 사용자 작성 함수입니다.
Snowflake는 Python 등 여러 언어로 작성된 UDF를 지원합니다.
Python UDF는 스칼라 함수입니다. UDF에 전달된 각 행에 대해 UDF는 값을 반환합니다.
UDF는 0개 이상의 매개 변수를 허용합니다.
사용자가 UDF를 호출하면 사용자는 UDF의 이름과 UDF의 매개 변수를 Snowflake에 전달합니다. UDF가 Python UDF인 경우, Snowflake는 적절한 Python 코드(핸들러 함수 라고 함)를 호출합니다. 그런 다음 핸들러 함수는 출력을 Snowflake로 반환하고 Snowflake는 이를 다시 클라이언트로 전달합니다.
Python UDF는 새 코드와 기존 패키지에 대한 호출을 둘 다 포함할 수 있으므로 유연성과 코드 재사용을 모두 허용합니다. 예를 들어, 이미 Python에 데이터 분석 코드가 있는 경우, 이를 Python UDF에 통합할 수 있습니다.
Snowflake는 현재 Python 버전 3.8에서 UDF 작성을 지원합니다.
Snowflake는 Anaconda와의 파트너십을 통해 서드 파티 Python 패키지를 제공합니다. 자세한 내용은 서드 파티 패키지 사용하기 을 참조하십시오.
참고
Python UDF 배치 API가 있으며, 이를 사용하면 입력 행 배치를 Pandas DataFrames 로 수신하고 결과 배치를 Pandas 배열 또는 Series 로 반환하는 Python 함수를 정의할 수 있습니다. 자세한 내용은 Python UDF Batch API 섹션을 참조하십시오.
Python UDF 사용 시기 결정하기¶
UDF를 쓸 수 있는 다른 잠재적인 언어에 대한 정보와 이러한 언어 간의 비교는 UDFs의 개요 를 참조하십시오.
Snowflake를 확장하는 다른 방법에 대한 정보는 다음을 참조하십시오.
Python UDF의 장점¶
Python UDF는 다음 중 하나 이상에 해당할 때 특히 적합합니다.
사용할 수 있는 Python 코드(소스 또는 컴파일)가 이미 있습니다.
코드는 표준 Python 패키지에 이미 존재하는 함수를 사용하거나 사용할 수 있습니다.
UDF를 지원하는 다른 언어만큼 또는 그보다 더 잘 Python을 알고 있습니다.
Python의 풍부한 서드 파티 생태계를 활용하시기를 원합니다.
Python UDF에 대한 제한 사항¶
일반 제한 사항¶
Python 함수는 표준 Python 패키지의 모듈과 함수를 사용할 수 있지만, Snowflake 보안 제약 조건으로 인해 네트워크 액세스와 파일에 쓰는 것과 같은 일부 기능이 비활성화됩니다. 자세한 내용은 우수한 보안 관행 따르기 섹션을 참조하십시오.
스테이지를 통해 가져온 모든 UDF와 모듈은 플랫폼 독립적이어야 하고 기본 확장 프로그램을 포함하지 않아야 합니다.
특정 CPU 아키텍처(예: x86)를 가정하는 코드를 피하십시오.
특정 운영 체제를 가정하는 코드를 피하십시오.
Python UDF는 공유할 수 없습니다. Python UDF를 사용하는 데이터베이스 오브젝트도 공유할 수 없습니다. 예를 들어, 사용자는 다음을 수행할 수 없습니다.
Python UDF를 직접 공유합니다.
Python UDF를 호출하는 뷰를 공유합니다.
Python UDF를 호출하는 함수를 공유합니다.
Python UDF를 호출하는 마스킹 또는 행 액세스 정책으로 테이블을 공유합니다.
Python UDF에 USAGE 권한을 부여하는 경우, 수신자는 해당 UDF에서 가져온 파일의 내용을 볼 수 있습니다. Python UDF에 대한 USAGE 권한을 역할에 부여하고 해당 역할이 해당 Python UDF를 호출하는 문을 실행하는 경우, 동일한 문에 있는 모든 Python UDF는 USAGE 권한을 부여받은 Python UDF에서 가져온 모든 파일의 내용을 읽을 수 있습니다.
데이터베이스 복제는 인라인 Python UDF에 대해 지원됩니다. 하지만 Python UDF가 스테이지(즉, IMPORTS 절을 사용하여 생성된 함수)의 파일에 대한 종속성이 있는 경우 복제가 차단됩니다. 이 제한은 향후 버전에서 제거될 수 있습니다.
Snowflake는 Python
zipimport
모듈을 사용하여 스테이지에서 Python 코드를 가져옵니다. 결과적으로 UDF에서도 모든zipimport
제한 사항이 있습니다.zipimport
에 대한 자세한 내용은 zipimport 참조 를 확인해 보십시오.
복제에 대한 제한 사항¶
Python UDF를 포함하는 데이터베이스 또는 스키마가 복제될 때 Python UDF를 복제할 수 있습니다. 복제하려면 Python UDF가 다음 조건을 충족해야 합니다.
Python UDF가 스테이지를 참조하는 경우, 해당 스테이지는 복제되는 스키마(또는 데이터베이스) 외부에 있어야 합니다.
다음과 같은 방법으로 Python UDF 및 해당 참조 스테이지를 별도의 스키마(및/또는 별도의 데이터베이스)에 보관할 수 있습니다.
Python UDF가 스테이지를 참조할 때마다, Python UDF의 스키마 또는 데이터베이스와는 다른 정규화된 스테이지 이름(예: 《my_db.my_schema.my_stage()》)을 사용하십시오. 복제 작업이 데이터베이스를 복제하는 경우, 스테이지 참조에는 데이터베이스와 스키마가 포함되어야 합니다. 복제 작업이 스키마를 복제하는 경우, 스테이지 참조에는 스키마(및 필요에 따라 데이터베이스)가 포함되어야 합니다.
정규화되지 않은 스테이지 이름(현재 세션의 활성 데이터베이스 및 스키마를 암시적으로 사용)을 사용하여 참조 스테이지를 만들고, 세션의 현재 데이터베이스 및 스키마와 일치하지 않는 정규화된 이름을 사용하여 Python UDF를 만듭니다.
사용자의 스테이지를 참조 스테이지로 사용합니다(사용자의 스테이지는 데이터베이스의 스테이지 또는 스키마의 스테이지와는 별개입니다).
스키마 또는 데이터베이스에 있는 하나 이상의 Python UDF가 필수 조건을 충족하지 않는 경우, 스키마 또는 데이터베이스를 계속 복제할 수 있지만, 비호환 Python UDF는 오류 또는 경고 메시지 없이 복제본에서 생략됩니다.
복제된 각 Python UDF는 원본과 동일한 정의를 갖습니다. 해당 정의에는 스테이지에 대한 모든 참조가 포함됩니다. Python UDF의 스테이지 참조는 정규화되어야 하므로, 복제되는 스키마 또는 데이터베이스에 상대적이지 않고 절대적입니다. 원본과 복제본이 모두 동일 스테이지와 파일을 가리키기 때문에 다음과 같습니다.
스테이지를 삭제하거나 스테이지에서 필수 파일을 제거하면 원본 UDF와 복제된 UDF가 모두 비활성화됩니다.
스테이지 또는 스테이지의 파일을 변경하면 원본 UDF와 복제된 UDF 모두에 영향을 줍니다.