작성자: Serge Rielau , Allison Wang
사용자 정의 함수(UDF)는 사용자가 Apache Spark™ SQL의 기본 기능을 확장할 수 있는 수단입니다. Databricks의 SQL은 1.3.0부터 Scala, Java, Python 및 R 프로그래밍 언어로 작성된 외부 사용자 정의 함수를 지원해 왔습니다. 외부 UDF는 매우 강력하지만 몇 가지 주의사항이 따릅니다.
위의 제한 사항을 해결하기 위해 새로운 형태의 UDF인 SQL UDF를 소개하게 되어 기쁩니다. DBR 9.1 LTS에서 사용할 수 있는 SQL UDF는 SQL의 표현력을 완전히 사용하여 정의되며 SQL 컴파일러에 완전히 투명합니다.
Databricks Lakehouse Platform의 내부 작동 방식을 알아보려면 데이터 레이크하우스가 차세대 데이터 웨어하우스인 이유 전자책을 확인하세요.
SQL UDF는 Databricks의 SQL에 대한 간단하면서도 강력한 확장 기능입니다. 함수로서 쿼리 구성을 단순화하는 추상화 계층을 제공하여 SQL 쿼리를 더 읽기 쉽고 모듈화합니다. SQL이 아닌 언어로 작성된 UDF와 달리 SQL UDF는 SQL 사용자가 생성하기에 더 가볍습니다. SQL 함수 본문은 쿼리 옵티마이저에 투명하므로 외부 UDF보다 성능이 뛰어납니다. SQL UDF는 임시 함수 또는 영구 함수로 생성할 수 있으며 여러 쿼리, 세션 및 사용자 간에 재사용할 수 있고 ACL(액세스 제어 언어)을 통해 액세스 제어가 가능합니다. 이 블로그에서는 예제를 통해 SQL UDF의 몇 가지 주요 사용 사례를 살펴보겠습니다.
상상할 수 있는 가장 간단한 함수인 상수부터 시작하겠습니다. 코드에 리터럴을 사용하면 가독성이 떨어지고, 나중에 상수가 변경될 수도 있기 때문에 사용하지 않는 것이 좋다는 것을 모두 알고 있습니다. 따라서 한 곳에서만 변경하고 싶을 것입니다.
외부 UDF에 익숙하다면 눈에 띄는 몇 가지 차이점을 볼 수 있습니다.
이러한 차이점 외에도 외부 UDF와 동일한 점이 많이 있습니다.
함수를 사용해 보겠습니다.
예상대로 작동합니다. 하지만 내부적으로는 어떻게 작동할까요?
멋지네요! SQL 컴파일러가 함수 호출을 상수로 대체했습니다.
이는 적어도 이 SQL UDF는 성능에 전혀 비용이 들지 않는다는 것을 의미합니다.
이제 또 다른 일반적인 사용 패턴을 살펴보겠습니다.
일부 내장 함수의 명명 규칙이 마음에 들지 않는다고 상상해 보세요. 다른 제품에서 많은 쿼리를 마이그레이션 중인데, 해당 제품은 함수 이름과 동작이 다를 수 있습니다. 또는 단순히 SQL 쿼리에서 길고 복잡한 표현식을 반복해서 복사하여 붙여넣는 것이 싫을 수도 있습니다. 그래서 이를 수정하고 싶습니다.
SQL UDF를 사용하면 원하는 이름으로 새 함수를 간단히 만들 수 있습니다.
여기서 사용된 새로운 구문을 살펴보겠습니다.
작동할 뿐만 아니라…
… 잘 작동합니다.
물리적 계획에서 lpad, hex, least 및 greatest 함수가 직접 적용되는 것을 볼 수 있습니다. 이것은 함수 시리즈를 직접 호출할 때 얻는 것과 동일한 계획입니다.
SQL 함수를 SQL 함수로 구성할 수도 있습니다.
SQL UDF의 또 다른 일반적인 용도는 조회 코드를 작성하는 것입니다. 간단한 조회는 RGB 색상 코드를 영어 색상 이름으로 디코딩하는 것일 수 있습니다.
알겠습니다. 하지만 세상에는 두 가지 색상보다 훨씬 더 많은 색상이 있습니다. 그리고 이 번역을 양방향으로 원하므로 실제로 조회 테이블에 있어야 합니다.
여기에는 여러 가지 새로운 개념이 적용되었습니다.
물리적 계획은 어떻게 보일까요? 중첩 루프 조인 결과를 생성하는 외부 UDF를 사용하는 것이 귀중한 리소스를 소모하는 끔찍한 방법이라는 것을 쉽게 알 수 있습니다.
이 경우 Catalyst는 중첩 루프 조인 대신 브로드캐스트 해시 조인을 선택했습니다. SQL UDF의 내용을 이해하기 때문에 그렇게 할 수 있습니다.
지금까지 논의된 모든 예제는 단일 값을 반환하는 스칼라 값 함수를 사용했습니다. 해당 결과는 구조체, 배열 및 맵의 복잡한 조합을 포함하여 어떤 유형이든 될 수 있습니다. 또한 논의할 다른 유형의 UDF가 있습니다. 바로 테이블 값 UDF입니다.
뷰에 인수가 있다고 상상해 보세요! 사용자 제공 값을 기반으로 하는 복잡한 술어를 캡슐화할 수 있습니다. SQL 테이블 UDF는 바로 그것입니다. 이름은 다르지만 매개변수가 있는 뷰입니다.
위의 색상 매핑이 고유하지 않다고 가정해 보겠습니다. 적어도 색상 이름이 언어마다 다르다는 것을 확인할 수 있습니다.
따라서 `from_rgb` 함수는 이름 배열 또는 관계를 반환하도록 수정해야 합니다.
보시다시피 스칼라 함수와의 유일한 차이점은 더 복잡한 RETURNS 절입니다. 뷰와 달리 SQL UDF는 반환되는 관계의 시그니처 선언을 의무화합니다.
사용자 정의 테이블 함수는 DBR에 새로 추가되었습니다. 호출 방법을 살펴보겠습니다.
가장 간단한 형태에서 테이블 함수는 뷰가 참조되는 방식과 동일한 장소에서 호출됩니다. 유일한 차이점은 함수 인수를 포함하는 필수 중괄호입니다. 이 함수는 리터럴 인수로 호출되지만 인수는 표현식, 심지어 스칼라 하위 쿼리일 수도 있습니다.
그러나 가장 강력한 기능은 일반적으로 상관 크로스 조인인 조인에서 SQL 테이블 UDF를 사용하는 것입니다.
여기서 인수는 FROM 절의 이전(측면) 관계를 참조합니다(상관 관계). 새로운 LATERAL 키워드는 Catalyst가 이러한 열을 해석할 수 있도록 허용합니다. 또한 결과 시그니처에 정의된 대로 열의 이름을 지정하고 선택적으로 함수 이름으로 한정하여 테이블 함수의 결과에 참조할 수 있다는 점에 유의하십시오.
당연히 SQL UDF는 기존 GRANT, REVOKE, SHOW, DESCRIBE 및 DROP 문에서 완벽하게 지원됩니다.
더 자세히 설명할 가치가 있는 문은 DESCRIBE입니다.
기본 describe는 예상대로 작동하지만 확장된 DESCRIBE는 훨씬 더 많은 세부 정보를 추가합니다.
지금까지 설명한 내용은 SQL UDF의 초기 기능입니다. 현재 고려 중인 향후 확장 기능에는 다음이 포함됩니다.
SQL UDF는 SQL 사용성을 크게 향상시킨 기능이며 이 블로그에서 설명한 대로 다양한 방식으로 사용될 수 있습니다. Databricks SQL에서 또는 데이터 엔지니어링 작업에 Photon을 사용하여 더 창의적인 방법으로 SQL UDF를 활용하는 방법을 생각해 보세요. 여기서 노트북을 사용해 보고 자세한 내용은 설명서를 참조하세요.
(이 글은 AI의 도움을 받아 번역되었습니다. 원문이 궁금하시다면 여 기를 클릭해 주세요)
블로그를 구독하고 최신 게시물을 이메일로 받아보세요.