주요 컨텐츠로 이동

테이블 값 함수를 위한 DataFrame API 소개

TVF와 함께 작업하는 더 간단하고 효율적인 방법

Introducing the DataFrame API for Table-Valued Functions

Published: June 25, 2025

공학4분 소요

Summary

  • 테이블 값 함수는 데이터 파이프라인에서 대량 변환을 수행하는 데 강력하고 간단한 방법을 제공합니다
  • 순차적 변환에서 연산자 체이닝을 위해 DataFrame API와 함께 사용하세요
  • 행 기반 변환의 동적 확장을 위해 DataFrame과 함께 lateral join을 사용하여 확장된 변환 세트를 반환하세요

테이블 값 함수(Table-Valued Functions, TVFs)는 오랫동안 구조화된 데이터를 처리하는 강력한 도구였습니다. 이들은 함수가 단일 값 대신 여러 행과 열을 반환하도록 허용합니다. 이전에는 Apache Spark 에서 TVFs를 사용하려면 SQL이 필요했으므로, DataFrame API를 선호하는 사용자에게는 유연성이 떨어졌습니다.

새로운 DataFrame API인 테이블 값 함수에 대해 발표하게 되어 기쁩니다. 사용자는 이제 DataFrame 작업 내에서 TVFs를 직접 호출하여 변환을 더 간단하게, 더 구성 가능하게 만들고 Spark의 DataFrame 워크플로우와 완전히 통합할 수 있습니다. 이것은 Databricks Runtime (DBR) 16.1 이상에서 사용 가능합니다.

이 블로그에서는 TVFs가 무엇인지 그리고 스칼라 및 테이블 인수와 함께 어떻게 사용하는지 살펴볼 것입니다. TVTs를 사용하는 세 가지 이점을 고려해 보세요:

주요 장점

  • 네이티브 DataFrame 통합: spark.tvf.<function_name>, 를 사용하여 TVF를 직접 호출하세요. SQL이 필요하지 않습니다.
  • 연결 가능하고 구성 가능: TVFs를 .filter(), .select(), 와 같은 좋아하는 DataFrame 변환과 쉽게 결합하세요. 등등.
  • 측면 조인 지원 (DBR 17.0에서 사용 가능): TVF를 조인에 사용하여 각 입력 행의 데이터를 기반으로 동적으로 행을 생성하고 확장합니다.

테이블 값 함수 DataFrame API 사용하기

내장 TVF를 사용한 간단한 예제로 시작해봅시다. Spark는 JSON 구조를 여러 행으로 확장하는 variant_explode와 같은 편리한 TVF를 제공합니다.

다음은 SQL 접근 방식입니다:

여기에 해당하는 DataFrame API 접근 방식이 있습니다:

위에서 볼 수 있듯이, SQL이나 DataFrame API를 통해 TVFs를 사용하는 것은 간단합니다. 둘 다 스칼라 인수를 사용하여 동일한 결과를 제공합니다.

테이블 인수 수용

테이블을 입력 인수로 사용하려면 어떻게 해야 할까요? 이는 데이터의 행을 작업하려는 경우 유용합니다. 자동차와 비행기로 여행하는 데 걸리는 시간과 비용을 계산하려는 예를 살펴봅시다.

간단한 DataFrame을 상상해봅시다:

우리의 클래스가 테이블 행을 인수로 처리할 수 있어야 합니다. eval 메소드가 스칼라 인수 대신 테이블에서 Row 인수를 받는 것에 주목하세요.

이 테이블에서 Row 를 처리하는 정의를 사용하면, 우리는 우리의 DataFrame을 테이블 인수로 보내 원하는 결과를 계산할 수 있습니다.

또는 테이블을 생성하고, UDTF를 등록하고, 다음과 같이 SQL 문에서 사용할 수 있습니다:

또는, lateral join을 사용하여 TVF를 호출함으로써 동일한 결과를 얻을 수 있습니다. 이는 스칼라 인수와 함께 유용합니다(아래 예제 참조).

다음 단계로 나아가기: 측면 조인

또한, lateral join을 사용하여 전체 DataFrame을 행 단위로 TVF를 호출할 수도 있습니다. 레터럴 조인과 테이블 인수 지원이 DBR 17.0에서 가능합니다.

각 lateral join은 DataFrame의 각 행에 대해 TVF를 호출할 수 있게 해주며, 그 행의 값에 따라 데이터를 동적으로 확장합니다. 한 행 이상을 가진 몇 가지 예를 살펴봅시다.

내장 TVF를 사용한 레터럴 조인

각 행이 숫자 배열을 포함하는 DataFrame이 있다고 가정해 봅시다. 이전과 마찬가지로, variant_explode 를 사용하여 각 배열을 개별 행으로 분해할 수 있습니다.

다음은 SQL 접근 방식입니다:

그리고 여기에 해당하는 DataFrame 접근 방식이 있습니다:

Python UDTF를 사용한 레터럴 조인

때때로, 내장 TVFs만으로는 충분하지 않습니다. 특정 방식으로 데이터를 변환하기 위해 사용자 정의 로직이 필요할 수 있습니다. 이때 사용자 정의 테이블 함수(User-Defined Table Functions, UDTFs)가 도움이 됩니다! Python UDTFs 를 사용하면 Python에서 자체 TVFs를 작성할 수 있어 행 확장 과정을 완전히 제어할 수 있습니다.

시작 값에서 끝 값까지의 숫자 시퀀스를 생성하고 숫자와 그 제곱을 반환하는 간단한 Python UDTF가 있습니다:

이제, 이 UDTF를 lateral join에서 사용해봅시다. 시작과 끝 열이 있는 DataFrame이 있고, 각 행에 대한 숫자 시퀀스를 생성하려고 상상해보세요.

이것은 UDTF를 사용하는 방법에 대한 또 다른 설명적인 예시입니다. lateralJoin [문서 보기] 를 DataFrame에 도시와 그 사이의 거리를 함께 사용합니다. 우리는 차량과 항공기를 이용한 이동 시간과 추가적인 항공료 등의 추가 정보를 포함한 새로운 테이블을 생성하고자 합니다.

위의 항공 거리 DataFrame을 사용해봅시다:

위에서 본 Python UDTF를 수정하여 두 도시 간의 여행 시간과 비용을 계산하는 eval 메소드가 스칼라 인수를 받도록 만들 수 있습니다:

마지막으로, 우리의 UDTF를 lateralJoin과 함께 호출하여 원하는 출력을 얻습니다. 이전의 항공사 예제와 달리, 이 UDTF의 eval 메소드는 스칼라 인수를 받습니다.

결론

테이블 값 함수를 위한 DataFrame API는 Spark 내에서 데이터 변환을 더욱 일관되고 직관적으로 접근할 수 있게 해줍니다. 우리는 TVF를 사용하는 세 가지 방법을 보여주었습니다: SQL, DataFrame, Python UDTF. TVFs를 DataFrame API와 결합함으로써 여러 행의 데이터를 처리하고 대량 변환을 달성할 수 있습니다.

또한, 테이블 인수를 전달하거나 Python UDTFs에 lateral join을 사용함으로써 특정 데이터 처리 요구에 대한 특정 비즈니스 로직을 구현할 수 있습니다. 스칼라 인수와 테이블 인수를 모두 사용하여 원하는 출력을 생성하기 위해 비즈니스 로직을 변환하고 확장하는 두 가지 구체적인 예를 보여주었습니다.

이 새로운 API의 기능을 탐색하여 데이터 변환과 워크플로우를 최적화하는 것을 권장합니다. 이 새로운 기능은 Apache Spark™ 4.0.0 릴리즈에서 사용 가능합니다. Databricks 고객이라면 DBR 16.1 이상에서 사용할 수 있습니다.

 

(이 글은 AI의 도움을 받아 번역되었습니다. 원문이 궁금하시다면 여기를 클릭해 주세요)

게시물을 놓치지 마세요

관심 있는 카테고리를 구독하고 최신 게시물을 받은편지함으로 받아보세요