주요 컨텐츠로 이동

테이블 값 함수를 위한 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의 도움을 받아 번역되었습니다. 원문이 궁금하시다면 여기를 클릭해 주세요)

게시물을 놓치지 마세요

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

다음은 무엇인가요?

Booting Databricks VMs 7x Faster for Serverless Compute

데이터 엔지니어링

November 25, 2024/1분 이내 소요

서버리스 컴퓨팅을 위한 Databricks VM 7배 빠른 부팅

제품

December 10, 2024/7분 소요

Batch Inference on Fine Tuned Llama Models with Mosaic AI Model Serving