주요 컨텐츠로 이동
Engineering blog

측면 열 별칭(Lateral Column Alias) 기능을 소개합니다

쿼리를 간소화하는 새로운 SQL 기능
Xinyi Yu
Wenchen Fan
Gengliang Wang
이 포스트 공유하기

(번역: Seungdon Choi) Original Blog Post

Apache Spark와 데이터브릭스에 새로운 SQL 기능을 지원하게 되어 기쁘게 생각합니다: 측면 열 별칭(LCA)입니다. 이 기능은 사용자가 동일한 SELECT 목록에서 이전에 지정된 표현식을 재사용할 수 있게 함으로써 복잡한 SQL 쿼리를 간소화하여 많은 경우 중첩된 하위 쿼리와 공통 테이블 표현식(CTE)을 사용할 필요가 없게 해줍니다. 이 블로그 게시물에서는 이 기능의 사용 사례와 이 기능이 Spark 및 데이터브릭스 사용자에게 가져다주는 이점에 대해 설명합니다.

측면 열 별칭 지원이란?

측면 열 별칭(LCA)은 사용자가 동일한 SELECT 목록 내에서 이전에 지정한 표현식을 재사용할 수 있는 기능을 제공합니다.
이 기능은 아래 제공된 예제를 통해 더 잘 이해할 수 있습니다. 다음은 간단한 쿼리입니다:

LCA가 지원되지 않는 경우 이 쿼리에서 사용자에게 SELECT 목록의 후자 a를 확인할 수 없다는 오류가 표시됩니다:

 

[UNRESOLVED_COLUMN.WITHOUT_SUGGESTION] A column or function parameter with name `a` cannot be resolved. ; line 1 pos 15;

 

다행히 LCA 기능을 사용하면 쿼리의 두 번째 a가 동일한 SELECT 목록에서 이전에 정의된 별칭인 1 AS a로 성공적으로 식별됩니다. 사용자에게 더 이상 오류가 표시되지 않고 다음과 같은 결과가 표시됩니다:

LCA 체인으로 복잡한 하위 쿼리 및 CTE 제거

앞의 예는 LCA의 기본 개념을 보여 주었지만, 이 기능의 진정한 힘은 복잡한 하위 쿼리와 CTE를 제거할 수 있는 기능에 있습니다.

LCA가 도입되기 전에는 사용자가 이전 별칭으로 정의된 속성을 참조하려고 할 때 여러 개의 하위 쿼리와 CTE를 처리해야 했습니다. 이로 인해 SQL 쿼리의 복잡성과 장황함이 증가하여 읽기, 쓰기 및 유지 관리가 어려웠습니다. 이와는 대조적으로, LCA 지원은 이러한 쿼리를 근본적으로 단순화하여 사용자 친화적이고 관리하기 쉽게 만듭니다.

예를 들어 보겠습니다. 이름, 카테고리, 가격, 고객 평점 등의 제품 정보를 저장하는 제품 테이블이 있다고 가정해 보겠습니다. 우리의 목표는 여러 가지 영향 요인을 기반으로 조정된 가격을 계산하는 것입니다. 이 시나리오는 LCA가 어떻게 복잡한 쿼리를 상당히 단순화된 버전으로 바꿀 수 있는지 명확하게 설명합니다.

다음은 테이블 구조입니다:

제품에 대한 사용자의 평가에 따른 가격 인상률과 카테고리 내 제품의 순위에 따른 가격 인상률 중 더 큰 값을 기준으로 각 제품의 조정된 가격을 계산하고 싶습니다. LCA가 지원되지 않는 경우 쿼리는 다음과 같이 표시됩니다:

이 논리에는 후자의 계산이 이전에 계산된 결과에 의존하는 많은 연쇄 연산이 포함되어 있습니다. 따라서 쿼리의 후속 단계에서 나중에 참조하기에 적합한 방식으로 각 중간 계산을 저장하려면 여러 개의 CTE가 필요합니다.

그러나 LCA를 사용하면 쿼리를 하나의 SELECT 문으로 표현할 수 있습니다:

LCA를 연결할 수도 있습니다! 즉, 후속 표현식에서 참조할 수 있는 현재 별칭 표현식이 이전에 정의된 측면 별칭을 참조할 수 있습니다. 예를 들어, final_increase_percentage의 정의는 두 개의 측면 열 별칭, 즉 increase_percentage_based_on_rating 및 increase_percentage_based_on_rank에 따라 달라집니다. 그런 다음 조정된 가격의 다음 계산은 최종_인상_퍼센티지를 참조합니다. 이러한 LCA의 연쇄성을 통해 사용자는 한 계산의 결과가 다음 계산의 입력으로 사용되는 일련의 종속 계산을 만들 수 있습니다.

위의 예에서 볼 수 있듯이 LCA는 쿼리를 크게 간소화하여 반복 계산이나 여러 CTE의 필요성을 제거하므로 이해, 유지 관리 및 디버깅이 더 쉬워집니다. 또한 쿼리에서 계산 정의와 사용법이 서로 가깝기 때문에 가독성도 향상됩니다.

LCA의 다양한 사용법

단순, 집계 또는 창 표현식

거의 모든 표현식이 측면 열 별칭 안에 위치할 수 있습니다. 마지막 섹션의 예제에서는 복잡한 CASE-WHEN 표현식뿐만 아니라 GREATEST 함수 표현식이나 창 함수도 측면 열 별칭 안에 위치하여 후속 표현식에서 추가로 사용할 수 있음을 보여 주었습니다.

마찬가지로 집계 표현식도 이러한 방식으로 중첩할 수 있습니다. 다음은 동일한 제품 테이블에 대한 예입니다:

복잡한 데이터 유형 (Complex data types)

LCA는 구조체, 배열, 맵과 같은 복잡한 데이터 유형에서도 잘 작동합니다. 예를 들어

비결정적 표현식 (Non-deterministic expressions)

LCA는 비결정적 표현식이 한 번만 평가되도록 보장하며, 이는 CTE가 제공하는 '실행 1회' 의미론을 반영합니다. 따라서 쿼리에 비결정적 표현식을 사용할 때 일관된 결과를 보장합니다.

예를 들어, 위의 제품 테이블에 각 제품에 대한 member_price가 있는 시나리오를 생각해 보겠습니다. 각 제품에 0%에서 5% 사이의 임의의 할인율을 적용한 다음 price와 member_price의 할인 가격을 계산하고 싶습니다. 이 연습을 통해 두 가격에 적용되는 할인율이 동일하게 유지되도록 해야 합니다.

LCA를 사용하면 다음과 같이 작성할 수 있습니다:

이 예제에서 데이터브릭스는 할인율을 한 번 계산하며, 이 값은 조정된 가격 및 조정된 멤버 가격 계산을 포함한 모든 후속 참조를 통해 동일하게 유지됩니다.

반면에 비결정적 표현식을 단순히 복사하는 경우에는 각 표현식을 개별적으로 평가하여 두 가격의 할인율이 일관되지 않게 되므로 이 동작이 적용되지 않습니다:

Try LCA!

요약하면, 측면 열 별칭은 사용자가 표현식 트리 위에 명명된 별칭을 정의한 다음 나중에 동일한 SELECT 절 내에서 이 별칭을 참조할 수 있도록 함으로써 SQL 쿼리를 크게 간소화하는 강력한 기능입니다.

  • 동일한 표현식을 여러 번 반복하거나 하위 쿼리 또는 CTE를 사용할 필요가 없으며, 대신 간결하고 읽기 쉬운 SELECT 쿼리를 생성할 수 있습니다.
  • 모든 종류의 표현식 및 복잡한 데이터 유형과 호환됩니다. SQL 구문은 이러한 별칭을 연결하여 유연성을 높일 수 있도록 지원합니다.
  • 각 비결정적 표현식은 한 번만 평가되므로 여러 참조에 걸쳐 일관된 결과를 얻을 수 있습니다.

LCA는 Databricks Runtime 12.2 LTS 이상, Databricks SQL 2023.20 이상 그리고 Apache Spark 3.4에서 완전히 사용 가능하며 기본적으로 활성화되어 있습니다. 

Read More

  • Resolution order
    호기심 많은 독자들은 LCA가 도입된 SQL 쿼리의 이름 확인 순서에 관심이 있을 것입니다. 이 데이터브릭스 이름 확인 문서에서는 참조를 확인하기 위한 명확한 순서 규칙과 구체적인 예제를 정의하며, 이 과정에서 LCA의 역할도 설명합니다.