주요 컨텐츠로 이동
Engineering blog

SQL 함수의 명명된 인수(Named Arguments)

이 포스트 공유하기

(번역: Youngkyong Ko) Original Blog Post

오늘은 SQL 함수에 명명된 인수(named arguments)를 사용할 수 있는 새로운 기능을 소개합니다. 이 기능을 사용하면 보다 유연한 방식으로 함수를 호출할 수 있습니다. 이 블로그에서는 먼저 이 기능이 어떻게 생겼는지 소개한 다음, SQL 사용자 정의 함수(UDF)의 맥락에서 이 기능이 무엇을 할 수 있는지 보여주고, 마지막으로 내장 함수에서 이 기능이 어떻게 작동하는지 살펴봅니다. 요약하자면, 명명된 인수는 SQL 헤비 유저와 라이트 유저 모두의 작업을 더 쉽게 만들어주는 새롭고 유용한 방법입니다.

명명된 인수란?

많은 프로그래밍 언어에서 함수 정의에는 하나 이상의 인수에 대한 기본값이 포함될 수 있습니다. 예를 들어 Python에서는 다음과 같은 메서드를 정의할 수 있습니다:

def botw(x, y = 6, z = 7): return x * y + z

사용자가 이 함수를 사용할 때 다음과 같은 방법을 사용할 수 있습니다:

botw(5, z = 8)

이는 키워드 인수의 예로, 매개변수 이름과 해당 인수 값을 연결하여 매개변수를 할당하는 것입니다. 이는 유연한 형태의 함수 호출 방법입니다. 특정 매개변수가 선택적이거나 함수에 사용할 수 있는 매개변수의 수가 많은 상황에서 특히 유용합니다.

이제 Apache Spark 3.5와 데이터브릭스 런타임 14.1에서 SQL 언어에 사용할 수 있는 유사한 구문이 발표되었습니다. 예를 들어:

SELECT sql_func(5, paramA => 6);

이 구문에서는 등호를 사용하는 대신 "뚱뚱한 화살표" 기호(=>)를 사용합니다. 이 명명된 인수 표현식 paramA => 6 은 위 Python 함수 호출에서 z = 8 에 해당합니다. 이제 다양한 유형의 SQL 함수에서 이 구문이 어떻게 작동하는지 살펴보겠습니다.

SQL UDF에서 명명된 인수 사용

SQL 사용자 정의 함수는 사용자가 필요에 따라 쿼리를 확장하고 커스터마이즈할 수 있는 유연성을 제공합니다. 또한 이 문서에 설명된 것처럼, 사용자가 Python 루틴을 플러그인하여 SQL 함수로 등록할 수도 있습니다.현재 이러한 UDF는 데이터브릭스 사용자의 애플리케이션에 널리 사용되고 있습니다.

새로 도입된 명명된 인수에 대한 지원은 위에서 설명한 내장 함수 지원과 동일합니다. 다음 SQL 문으로 사용자 정의 함수를 만드는 예를 살펴보겠습니다:

CREATE FUNCTION henry_stickman(x INT, y INT DEFAULT 6, z INT DEFAULT 8)
RETURN x * y * y + z;

mask 함수의 경우와 마찬가지로 다음과 같이 호출할 수 있습니다:

SELECT henry_stickman(7, z => 9);

> 261

이 기능은 입력 매개변수 목록이 길어지는 UDF에 특히 유용합니다. 이 기능을 사용하면 SQL 사용자가 함수 호출 중에 모든 값을 위치별로 열거하는 대신 몇 가지 값만 지정할 수 있습니다. SQL UDF 문법에서는 모든 SQL UDF 정의에 사용자 지정 인수 이름이 포함되도록 하고 있으므로, 이 점을 활용할 수 있습니다. 

내장 Spark SQL 함수에서 명명된 인수 사용

이 기능은 아파치 스파크에서도 작동합니다. 예를 들어 mask SQL 함수에는 5개의 입력 매개변수가 있으며, 이 중 마지막 4개의 매개변수는 선택적입니다. 위치 순서에 따른 매개변수 명은 다음과 같습니다:

  1. str (STRING, required)
  2. upperChar (STRING, optional)
  3. lowerChar (STRING, optional)
  4. digitChar (STRING, optional)
  5. otherChar (STRING, optional)

다음과 같은 방식으로 mask SQL 함수를 호출할 수 있습니다. 여기서는 digitChar의 인수 할당을 변경하고 다른 선택적 매개변수는 여전히 동일한 값을 갖도록 하려고 합니다. 위치 인수만 지원되는 언어의 경우 호출 구문은 다음과 같습니다:

SELECT mask(‘lord of the 42 rings’, NULL, NULL, ‘9’, NULL);

> lord of the 99 rings

이 방식은 그리 이상적이지 않은데, 기본값을 아는 다른 선택적 매개변수들에도 일일이 인수를 지정해야 하기 때문입니다. 함수의 매개변수가 수백 개로 늘어날 경우, 목록 뒷 부분의 매개변수 하나만 변경하고 싶은 경우에도 그 앞의 수 많은 매개변수 값을 일일이 열거해야 하는 불편함이 있습니다.

명명된 인수를 사용하면 완전히 달라집니다. 이제 다음과 같은 구문을 사용할 수 있습니다:

SELECT mask(‘lord of the 42 rings’, digitChar =>9’);

> lord of the 99 rings

키워드 인수를 사용하면 매개변수 이름 digitChar를 지정하고 값 '9'를 할당하기만 하면 됩니다. 즉, 더 이상 digitChar의 앞에 있는 선택적 매개변수들의 값을 열거할 필요가 없습니다. 더불어, 더 읽기 쉬운 코드와 간결한 함수 호출이 가능해졌습니다.

내장 Databricks 함수에서도 명명된 인수 사용

명명된 인수는 데이터브릭스 런타임 14.1에 도입된 많은 SQL 함수의 핵심적인 구성 요소가 되었습니다.

예를 들어, 정의할 수 있는 설정들이 매우 많은 read_files 함수의 경우 수백 개의 매개변수가 있습니다(문서 참조). 따라서 이러한 설계로 인해 일부 매개변수는 선택적일 수 밖에 없으며, 명명된 인수를 사용하여 값을 할당해야 합니다.

명명된 인수를 지원하는 다른 여러 SQL 함수도 구현되고 있습니다. 이 구현 과정에서도 키워드 인수를 사용한 값 지정 방식이 유일한 합리적 해결책인 경우가 많았습니다.

결론: 명명된 인수로 삶이 더 편해집니다

이 기능은 많은 SQL 사용 사례에서 삶의 질을 개선하고 사용성을 높여줍니다. 이 기능을 통해 사용자는 간결하고 읽기 쉬운 방식으로 함수를 생성하고 호출할 수 있습니다. 또한 이 기능은 현재 데이터브릭스 런타임에서 진행 중인 여러 개선과제의 핵심 기반이 되고 있습니다. 명명된 인수 지원은 필수불가결한 기능으로, 현재와 미래의 다양한 유형의 함수를 더 쉽게 작성하고 호출할 수 있게 해줍니다. 명명된 인수는 데이터브릭스 런타임 14.1 이상 및 아파치 스파크 3.5에서 사용할 수 있습니다. 즐겁게 그리고 편하게 쿼리하세요!

Databricks 무료로 시작하기

관련 포스트

Platform blog

Introducing SQL User-Defined Functions

October 20, 2021 작성자: Serge Rielau, Allison Wang in 플랫폼 블로그
A user-defined function (UDF) is a means for a user to extend the native capabilities of Apache Spark™ SQL. SQL on Databricks has...
Platform blog

Power to the SQL People: Introducing Python UDFs in Databricks SQL

We were thrilled to announce the preview for Python User-Defined Functions (UDFs) in Databricks SQL (DBSQL) at last month's Data and AI Summit...
모든 엔지니어링 블로그 포스트 보기