Unity 카탈로그에서 기능 테이블 작업
이 페이지에서는 Unity 카탈로그에서 기능 테이블을 만들고 사용하는 방법을 설명합니다.
이 페이지는 Unity 카탈로그에 대해 사용하도록 설정된 작업 영역에만 적용됩니다. Unity 카탈로그에 대해 작업 영역을 사용하도록 설정하지 않은 경우 작업 영역 기능 저장소(레거시)기능 테이블과 작업하는 방법을 참조하세요.
이 페이지의 예제에서 사용되는 명령 및 매개 변수에 대한 자세한 내용은 기능 엔지니어링 Python API 참조를 참조하세요.
요구 사항
Unity 카탈로그의 기능 엔지니어링에는 Databricks Runtime 13.2 이상이 필요합니다. 또한 Unity 카탈로그 메타스토어에는 권한 모델 버전 1.0이 있어야 합니다.
Unity 카탈로그 Python 클라이언트에 기능 엔지니어링 설치
Unity 카탈로그의 기능 엔지니어링에는 Python 클라이언트 FeatureEngineeringClient
가 있습니다. 이 클래스는 databricks-feature-engineering
패키지와 함께 PyPI에서 사용할 수 있으며 Databricks Runtime 13.3 LTS ML 이상에 미리 설치되어 있습니다. 비ML Databricks 런타임을 사용하는 경우 클라이언트를 수동으로 설치해야 합니다.
호환성 매트릭스를 사용하여 Databricks 런타임 버전에 맞는 버전을 찾습니다.
%pip install databricks-feature-engineering
dbutils.library.restartPython()
Unity 카탈로그에서 기능 테이블에 대한 카탈로그 및 스키마 만들기
새 카탈로그를 만들거나 기능 테이블에 기존 카탈로그를 사용해야 합니다.
새 카탈로그를 만들려면 CREATE CATALOG
에 대한 권한이 있어야 합니다.
CREATE CATALOG IF NOT EXISTS <catalog-name>
기존 카탈로그를 사용하려면 카탈로그에 USE CATALOG
권한이 있어야 합니다.
USE CATALOG <catalog-name>
Unity 카탈로그의 기능 테이블은 스키마에 저장되어야 합니다. 카탈로그에 새 스키마를 만들려면 카탈로그에 대한 CREATE SCHEMA
권한이 있어야 합니다.
CREATE SCHEMA IF NOT EXISTS <schema-name>
Unity 카탈로그에 기능 테이블 만들기
참고 항목
기본 키 제약 조건을 기능 테이블로 포함하는 Unity 카탈로그의 기존 델타 테이블을 사용할 수 있습니다. 테이블에 기본 키가 정의되어 있지 않은 경우 ALTER TABLE
DDL 문을 사용하여 테이블을 업데이트하여 제약 조건을 추가해야 합니다.
기능 테이블로 Unity 카탈로그의 기존 Delta 테이블 사용을 참조하세요.
그러나 Delta Live Tables 파이프라인에 의해 Unity 카탈로그에 게시된 스트리밍 테이블 또는 구체화된 뷰에 기본 키를 추가하려면 스트리밍 테이블의 스키마 또는 구체화된 뷰 정의를 수정하여 기본 키를 포함하고 스트리밍 테이블 또는 구체화된 뷰를 새로 고쳐야 합니다. Delta Live Tables 파이프라인을 기능 테이블로 생성된 스트리밍 테이블 또는 구체화된 뷰 사용을 참조하세요.
Unity 카탈로그의 기능 테이블은 Delta 테이블입니다. 기능 테이블에는 기본 키가 있어야 합니다. Unity 카탈로그의 다른 데이터 자산과 같은 기능 테이블은 다음 세 가지 수준 네임스페이스(<catalog-name>.<schema-name>.<table-name>
)를 사용하여 액세스됩니다.
Databricks SQL, Python FeatureEngineeringClient
또는 Delta Live Tables 파이프라인을 사용하여 Unity 카탈로그에서 기능 테이블을 만들 수 있습니다.
Databricks SQL
기본 키 제약 조건이 있는 델타 테이블을 기능 테이블로 사용할 수 있습니다. 다음 코드는 기본 키를 사용하여 테이블을 만드는 방법을 보여줍니다.
CREATE TABLE ml.recommender_system.customer_features (
customer_id int NOT NULL,
feat1 long,
feat2 varchar(100),
CONSTRAINT customer_features_pk PRIMARY KEY (customer_id)
);
시계열 기능 테이블을 만들려면 시간 열을 기본 키 열로 추가하고 TIMESERIES 키워드를 지정합니다. TIMESERIES 키워드에는 Databricks Runtime 13.3 LTS 이상이 필요합니다.
CREATE TABLE ml.recommender_system.customer_features (
customer_id int NOT NULL,
ts timestamp NOT NULL,
feat1 long,
feat2 varchar(100),
CONSTRAINT customer_features_pk PRIMARY KEY (customer_id, ts TIMESERIES)
);
테이블을 만든 후에는 다른 델타 테이블처럼 데이터를 작성할 수 있으며 기능 테이블로 사용할 수 있습니다.
Python
다음 예제에서 사용되는 명령 및 매개 변수에 대한 자세한 내용은 기능 엔지니어링 Python API 참조를 참조하세요.
- Python 함수를 작성하여 기능을 계산합니다. 각 함수의 출력은 고유한 기본 키가 있는 Apache Spark DataFrame이어야 합니다. 기본 키는 하나 이상의 열로 구성할 수 있습니다.
-
FeatureEngineeringClient
를 인스턴스화하고create_table
을 사용하여 기능 테이블을 만듭니다. -
write_table
을 사용하여 기능 테이블을 채웁니다.
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
# Prepare feature DataFrame
def compute_customer_features(data):
''' Feature computation code returns a DataFrame with 'customer_id' as primary key'''
pass
customer_features_df = compute_customer_features(df)
# Create feature table with `customer_id` as the primary key.
# Take schema from DataFrame output by compute_customer_features
customer_feature_table = fe.create_table(
name='ml.recommender_system.customer_features',
primary_keys='customer_id',
schema=customer_features_df.schema,
description='Customer features'
)
# An alternative is to use `create_table` and specify the `df` argument.
# This code automatically saves the features to the underlying Delta table.
# customer_feature_table = fe.create_table(
# ...
# df=customer_features_df,
# ...
# )
# To use a composite primary key, pass all primary key columns in the create_table call
# customer_feature_table = fe.create_table(
# ...
# primary_keys=['customer_id', 'date'],
# ...
# )
# To create a time series table, set the timeseries_columns argument
# customer_feature_table = fe.create_table(
# ...
# primary_keys=['customer_id', 'date'],
# timeseries_columns='date',
# ...
# )
Delta Live Tables 파이프라인을 사용하여 Unity 카탈로그에서 기능 테이블 만들기
참고 항목
테이블 제약 조건에 대한 Delta Live Tables 지원은 공개 미리 보기로 제공됩니다. 다음 코드 예제는 Delta Live Tables 프리뷰 채널을 사용하여 실행해야 합니다.
기본 키 제약 조건을 포함하는 Delta Live Tables 파이프라인에서 게시된 모든 테이블을 기능 테이블로 사용할 수 있습니다. 기본 키를 사용하여 Delta Live Tables 파이프라인에서 테이블을 만들려면 Databricks SQL 또는 Delta Live Tables Python 프로그래밍 인터페이스를 사용할 수 있습니다.
기본 키를 사용하여 Delta Live Tables 파이프라인에서 테이블을 만들려면 다음 구문을 사용합니다.
Databricks SQL
CREATE LIVE TABLE customer_features (
customer_id int NOT NULL,
feat1 long,
feat2 varchar(100),
CONSTRAINT customer_features_pk PRIMARY KEY (customer_id)
) AS SELECT * FROM ...;
Python
import dlt
@dlt.table(
schema="""
customer_id int NOT NULL,
feat1 long,
feat2 varchar(100),
CONSTRAINT customer_features_pk PRIMARY KEY (customer_id)
""")
def customer_features():
return ...
시계열 기능 테이블을 만들려면 시간 열을 기본 키 열로 추가하고 TIMESERIES 키워드를 지정합니다.
Databricks SQL
CREATE LIVE TABLE customer_features (
customer_id int NOT NULL,
ts timestamp NOT NULL,
feat1 long,
feat2 varchar(100),
CONSTRAINT customer_features_pk PRIMARY KEY (customer_id, ts TIMESERIES)
) AS SELECT * FROM ...;
Python
import dlt
@dlt.table(
schema="""
customer_id int NOT NULL,
ts timestamp NOT NULL,
feat1 long,
feat2 varchar(100),
CONSTRAINT customer_features_pk PRIMARY KEY (customer_id, ts TIMESERIES)
""")
def customer_features():
return ...
테이블을 만든 후에는 다른 Delta Live Tables 데이터 세트처럼 데이터를 작성할 수 있으며 기능 테이블로 사용할 수 있습니다.
Unity 카탈로그의 기존 델타 테이블을 기능 테이블로 사용
기본 키가 있는 Unity 카탈로그의 모든 델타 테이블은 Unity 카탈로그의 기능 테이블일 수 있으며, 테이블과 함께 기능 UI 및 API를 사용할 수 있습니다.
참고 항목
- 테이블 소유자만 기본 키 제약 조건을 선언할 수 있습니다. 소유자의 이름은 카탈로그 탐색기의 테이블 세부 정보 페이지에 표시됩니다.
- Delta 테이블의 데이터 형식이 Unity 카탈로그의 기능 엔지니어링에서 지원되는지 확인합니다. 지원되는 데이터 형식을 참조하세요.
- TIMESERIES 키워드에는 Databricks Runtime 13.3 LTS 이상이 필요합니다.
기존 델타 테이블에 기본 키 제약 조건이 없는 경우 다음과 같이 만들 수 있습니다.
기본 키 열을
NOT NULL
로 설정합니다. 각 기본 키 열에 대해 다음을 실행합니다.ALTER TABLE <full_table_name> ALTER COLUMN <pk_col_name> SET NOT NULL
기본 키 제약 조건을 추가하도록 테이블을 변경합니다.
ALTER TABLE <full_table_name> ADD CONSTRAINT <pk_name> PRIMARY KEY(pk_col1, pk_col2, ...)
pk_name
은 기본 키 제약 조건의 이름입니다. 규칙에 따라_pk
접미사와 함께 테이블 이름(스키마 및 카탈로그 제외)을 사용할 수 있습니다. 예를 들어"ml.recommender_system.customer_features"
라는 이름의 테이블은 기본 키 제약 조건의 이름으로customer_features_pk
를 갖습니다.테이블을 시계열 기능 테이블로 만들려면 다음과 같이 기본 키 열 중 하나에 TIMESERIES 키워드를 지정합니다.
ALTER TABLE <full_table_name> ADD CONSTRAINT <pk_name> PRIMARY KEY(pk_col1 TIMESERIES, pk_col2, ...)
테이블에 기본 키 제약 조건을 추가하면 테이블이 기능 UI에 표시되고 기능 테이블로 사용할 수 있습니다.
Delta Live Tables 파이프라인을 기능 테이블로 생성된 스트리밍 테이블 또는 구체화된 뷰 사용
기본 키가 있는 Unity 카탈로그의 스트리밍 테이블 또는 구체화된 뷰는 Unity 카탈로그의 기능 테이블일 수 있으며, 테이블과 함께 기능 UI 및 API를 사용할 수 있습니다.
참고 항목
- 테이블 제약 조건에 대한 Delta Live Tables 지원은 공개 미리 보기로 제공됩니다. 다음 코드 예제는 Delta Live Tables 프리뷰 채널을 사용하여 실행해야 합니다.
- 테이블 소유자만 기본 키 제약 조건을 선언할 수 있습니다. 소유자의 이름은 카탈로그 탐색기의 테이블 세부 정보 페이지에 표시됩니다.
- Unity 카탈로그의 기능 엔지니어링이 델타 테이블의 데이터 형식을 지원하는지 확인합니다. 지원되는 데이터 형식을 참조하세요.
기존 스트리밍 테이블 또는 구체화된 뷰에 대한 기본 키를 설정하려면 개체를 관리하는 Notebook에서 스트리밍 테이블 또는 구체화된 뷰의 스키마를 업데이트합니다. 그런 다음 테이블을 새로 고쳐 Unity 카탈로그 개체를 업데이트합니다.
다음은 구체화된 뷰에 기본 키를 추가하는 구문입니다.
Databricks SQL
CREATE OR REFRESH MATERIALIZED VIEW existing_live_table(
id int NOT NULL PRIMARY KEY,
...
) AS SELECT ...
Python
import dlt
@dlt.table(
schema="""
id int NOT NULL PRIMARY KEY,
...
"""
)
def existing_live_table():
return ...
Unity 카탈로그의 기존 보기를 기능 테이블로 사용
보기를 기능 테이블로 사용하려면 Databricks Runtime 16.0 ML에 기본 제공되는 databricks-feature-engineering
버전 0.7.0 이상을 사용해야 합니다.
Unity 카탈로그의 간단한 SELECT 보기는 Unity 카탈로그의 기능 테이블일 수 있으며 테이블과 함께 기능 API를 사용할 수 있습니다.
참고 항목
- 간단한 SELECT 뷰는 기능 테이블로 활용될 수 있으며, JOIN, GROUP BY, DISTINCT 절을 사용하지 않고 기본 키를 선택하는 방식으로 Unity 카탈로그 내의 단일 델타 테이블에서 생성된 뷰로 정의됩니다. SQL 문에서 허용되는 키워드는 SELECT, FROM, WHERE, ORDER BY, LIMIT 및 OFFSET입니다.
- 지원되는 데이터 형식은 지원되는 데이터 형식 참조하세요.
- 보기로 지원되는 기능 테이블은 기능 UI에 표시되지 않습니다.
- 원본 델타 테이블에서 열 이름이 바뀐 경우 뷰 정의에 대한 SELECT 문의 열 이름을 일치하도록 변경해야 합니다.
다음은 기능 테이블로 사용할 수 있는 간단한 SELECT 보기의 예입니다.
CREATE OR REPLACE VIEW ml.recommender_system.content_recommendation_subset AS
SELECT
user_id,
content_id,
user_age,
user_gender,
content_genre,
content_release_year,
user_content_watch_duration,
user_content_like_dislike_ratio
FROM
ml.recommender_system.content_recommendations_features
WHERE
user_age BETWEEN 18 AND 35
AND content_genre IN ('Drama', 'Comedy', 'Action')
AND content_release_year >= 2010
AND user_content_watch_duration > 60;
뷰를 기반으로 하는 기능 테이블은 오프라인 모델 학습 및 평가에 사용할 수 있습니다. 온라인 스토어에 게시할 수 없습니다. 이러한 기능을 기반으로 하는 이러한 테이블 및 모델의 기능은 제공될 수 없습니다.
Unity 카탈로그에서 기능 테이블 업데이트
새 기능을 추가하거나 기본 키를 기준으로 특정 행을 수정하여 Unity 카탈로그에서 기능 테이블을 업데이트할 수 있습니다.
다음 기능 테이블 메타데이터는 업데이트해서는 안 됩니다.
- 기본 키.
- 파티션 키입니다.
- 기존 기능의 이름 또는 데이터 형식
이를 변경하면 모델 학습 및 서비스 기능을 사용하는 다운스트림 파이프라인이 중단됩니다.
Unity 카탈로그의 기존 기능 테이블에 새 기능 추가
다음의 두 가지 방법 중 하나로 기존 기능 테이블에 새 기능을 추가할 수 있습니다.
- 기존 기능 계산 함수를 업데이트하고 반환된 DataFrame을 사용하여
write_table
을 실행합니다. 그러면 기능 테이블 스키마가 업데이트되고 기본 키를 기준으로 새 기능 값이 병합됩니다. - 새 기능 계산 함수를 만들어 새 기능 값을 계산합니다. 이 새 계산 함수에서 반환된 DataFrame에는 기능 테이블의 기본 키와 파티션 키(정의된 경우)가 포함되어야 합니다. 기본 키를 사용하여 기존 기능 테이블에 새 기능을 쓸 수 있도록 DataFrame을 사용해
write_table
을 실행합니다.
기능 테이블의 특정 행만 업데이트
mode = "merge"
에서 write_table
를 사용합니다.
write_table
호출에서 전송된 DataFrame에 기본 키가 없는 행은 변경되지 않은 상태로 유지됩니다.
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
fe.write_table(
name='ml.recommender_system.customer_features',
df = customer_features_df,
mode = 'merge'
)
기능 테이블을 업데이트하는 작업 예약
기능 테이블의 기능에 항상 최신 값이 있는지 확인하기 위해 Databricks에서 정기적으로(예: 매일) 기능 테이블을 업데이트하기 위해 Notebook을 실행하는 작업을 만들 것을 권장합니다. 예약되지 않은 작업을 이미 만든 경우 예약된 작업으로 변환하여 기능 값이 항상 최신 상태인지 확인할 수 있습니다. 워크플로 예약 및 오케스트레이션을 참조하세요.
기능 테이블을 업데이트하는 코드에서는 다음 예제와 같이 mode='merge'
를 사용합니다.
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
customer_features_df = compute_customer_features(data)
fe.write_table(
df=customer_features_df,
name='ml.recommender_system.customer_features',
mode='merge'
)
과거 일일 기능 값 저장
복합 기본 키를 사용하여 기능 테이블을 정의합니다. 기본 키에 날짜를 포함합니다. 예를 들어 customer_features
기능 테이블의 경우 복합 기본 키(date
, customer_id
)와 파티션 키(date
)를 사용해 효과적으로 읽을 수 있습니다.
Databricks는 효율적인 읽기를 위해 테이블에서 Liquid 클러스터링을 사용하도록 설정하는 것이 좋습니다. Liquid 클러스터링을 사용하지 않는 경우 더 나은 읽기 성능을 위해 날짜 열을 파티션 키로 설정합니다.
Databricks SQL
CREATE TABLE ml.recommender_system.customer_features (
customer_id int NOT NULL,
`date` date NOT NULL,
feat1 long,
feat2 varchar(100),
CONSTRAINT customer_features_pk PRIMARY KEY (`date`, customer_id)
)
-- If you are not using liquid clustering, uncomment the following line.
-- PARTITIONED BY (`date`)
COMMENT "Customer features";
Python
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
fe.create_table(
name='ml.recommender_system.customer_features',
primary_keys=['date', 'customer_id'],
# If you are not using liquid clustering, uncomment the following line.
# partition_columns=['date'],
schema=customer_features_df.schema,
description='Customer features'
)
그러면 date
기능 테이블 필터링에서 관심 기간까지 읽을 코드를 만들 수 있습니다.
또는 create_training_set
를 사용할 때 지정 시간 조회를 사용하도록 설정하는 score_batch
을 만들 수도 있습니다.
Unity 카탈로그에서 시계열 기능 테이블 만들기를 참조하세요.
기능 테이블을 최신 상태로 유지하려면 기능을 쓰거나 새로운 기능 값을 기능 테이블에 스트리밍하도록 정기적으로 예약된 작업을 설정합니다.
기능을 업데이트하는 스트리밍 기능 계산 파이프라인 만들기
스트리밍 기능 계산 파이프라인을 만들려면 DataFrame
스트리밍을 write_table
에 인수로 전달합니다. 이 메서드는 StreamingQuery
개체를 반환합니다.
def compute_additional_customer_features(data):
''' Returns Streaming DataFrame
'''
pass
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
customer_transactions = spark.readStream.table("prod.events.customer_transactions")
stream_df = compute_additional_customer_features(customer_transactions)
fe.write_table(
df=stream_df,
name='ml.recommender_system.customer_features',
mode='merge'
)
Unity 카탈로그의 기능 테이블에서 읽기
read_table
을 사용하여 기능 값을 읽습니다.
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
customer_features_df = fe.read_table(
name='ml.recommender_system.customer_features',
)
Unity 카탈로그에서 기능 테이블 검색 및 찾아보기
기능 UI를 사용하여 Unity 카탈로그의 기능 테이블을 검색하거나 찾아봅니다.
사이드바에서 기능을 클릭하여 기능 UI를 표시합니다.
카탈로그 선택기가 있는 카탈로그를 선택하여 해당 카탈로그에서 사용 가능한 모든 기능 테이블을 봅니다. 검색 상자에 기능 테이블, 기능 또는 설명의 이름 중 일부 또는 전부를 입력합니다. 태그의 키 또는 값 중 일부 또는 전부를 입력할 수도 있습니다. 검색 텍스트는 대/소문자를 구분하지 않습니다.
Unity 카탈로그에서 기능 테이블의 메타데이터 가져오기
get_table
을 사용하여 기능 테이블 메타데이터를 가져옵니다.
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
ft = fe.get_table(name="ml.recommender_system.user_feature_table")
print(ft.features)
Unity 카탈로그에서 기능 테이블 및 기능과 함께 태그 사용
간단한 키-값 쌍인 태그를 사용하여 기능 테이블 및 기능을 분류하고 관리할 수 있습니다.
기능 테이블의 경우 카탈로그 탐색기, Notebook 또는 SQL 쿼리 편집기의 SQL 문 또는 기능 엔지니어링 Python API를 사용하여 태그를 만들고, 편집하고, 삭제할 수 있습니다.
기능의 경우 Notebook 또는 SQL 쿼리 편집기에서 카탈로그 탐색기 또는 SQL 문을 사용하여 태그를 만들고, 편집하고, 삭제할 수 있습니다.
Unity 카탈로그 보안 개체에 태그 적용하기 및 기능 엔지니어링 및 작업 영역 기능 저장소 Python API를 참조하세요.
다음 예제에서는 기능 엔지니어링 Python API를 사용하여 기능 테이블 태그를 만들고, 업데이트하고, 삭제하는 방법을 보여 줍니다.
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
# Create feature table with tags
customer_feature_table = fe.create_table(
# ...
tags={"tag_key_1": "tag_value_1", "tag_key_2": "tag_value_2", ...},
# ...
)
# Upsert a tag
fe.set_feature_table_tag(name="customer_feature_table", key="tag_key_1", value="new_key_value")
# Delete a tag
fe.delete_feature_table_tag(name="customer_feature_table", key="tag_key_2")
Unity 카탈로그에서 기능 테이블 삭제
카탈로그 탐색기를 사용하거나 기능 엔지니어링 Python API를 사용하여 Unity 카탈로그에서 델타 테이블을 직접 삭제하여 Unity 카탈로그에서 기능 테이블을 삭제할 수 있습니다.
참고 항목
- 기능 테이블을 삭제하면 업스트림 프로듀서 및 다운스트림 소비자(모델, 엔드포인트, 예약된 작업)에서 예기치 않은 오류가 발생할 수 있습니다. 클라우드 공급자를 사용하여 게시된 온라인 스토어를 삭제해야 합니다.
- Unity 카탈로그에서 기능 테이블을 삭제하면 기본 Delta 테이블도 삭제됩니다.
-
drop_table
는 Databricks Runtime 13.1 ML 이하에서 지원되지 않습니다. 테이블을 삭제하려면 SQL 명령을 사용합니다.
Databricks SQL 또는 FeatureEngineeringClient.drop_table
을 사용하여 Unity 카탈로그에서 기능 테이블을 삭제할 수 있습니다.
Databricks SQL
DROP TABLE ml.recommender_system.customer_features;
Python
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
fe.drop_table(
name='ml.recommender_system.customer_features'
)
작업 영역 또는 계정 간에 Unity 카탈로그의 기능 테이블 공유
Unity 카탈로그의 기능 테이블은 테이블의 Unity 카탈로그 메타스토어에 할당된 모든 작업 영역에서 액세스할 수 있습니다.
동일한 Unity 카탈로그 메타스토어에 할당되지 않은 작업 영역과 기능 테이블을 공유하려면 Delta Sharing을 사용합니다.