가상 테이블 입력과 출력 API
transforms-tables의 TableInput과 TableOutput은 Foundry 가상 테이블 자산을 변환에 연결합니다. 외부 테이블을 새 출력으로 등록할 때는 Foundry 위치뿐 아니라 소스 연결과 외부 저장 위치도 지정합니다.
TableInput과 TableOutput
| 구성 | 인자 | 의미 |
|---|---|---|
TableInput(alias) | alias: str | 입력 가상 테이블의 Compass 경로나 RID |
새 TableOutput(alias, source, table) | alias: str | Foundry에서 가상 테이블을 등록할 Compass 경로 |
| 동일 | source: str | 외부 출력에 사용할 소스 RID |
| 동일 | table: Table | 외부 플랫폼 안의 저장 위치를 표현하는 locator |
기존 TableOutput(alias) | alias: str | 이미 생성한 가상 테이블 RID |
Foundry 가상 출력 자산은 데이터셋 출력처럼 checks 과정에서 생성됩니다. 생성한 뒤에는 source와 table 설정을 생략하고 기존 가상 테이블 RID로 참조할 수 있습니다. 생성 이후 소스나 외부 위치를 변경하면 checks가 실패합니다. 기존 자산의 locator를 바꾸는 방식으로 다른 외부 테이블을 가리키게 할 수 없습니다.
Foundry Spark 실행에서는 함수에 TableTransformInput과 TableTransformOutput 핸들이 전달됩니다. 입력의 dataframe()은 Spark DataFrame을 읽으며 출력의 write_dataframe()으로 씁니다. JDBC 읽기 옵션은 dataframe(options={...})에 전달합니다.
BigQueryTable
BigQueryTable(project, dataset, table):
| 인자 | 자료형 | 필수 | 의미 |
|---|---|---|---|
project | str | 예 | BigQuery dataset이 속한 Google Cloud 프로젝트 ID |
dataset | str | 예 | 테이블을 담는 BigQuery dataset 이름 |
table | str | 예 | BigQuery 테이블 이름 |
세 인자는 모두 필수입니다. BigQuery의 dataset은 테이블을 담는 외부 네임스페이스이며 Foundry 데이터셋 자산과 구분합니다.
BigQuery pushdown은 transform.bigquery.using()과 IbisInput, IbisOutput을 사용합니다. IbisInput.table()은 Ibis 테이블 표현식을 반환하고 IbisOutput.write(table_expr)는 그 표현식을 출력에 씁니다. 연결은 선언한 가상 입력/출력의 소스 설정으로 만들어집니다.
DatabricksTable
DatabricksTable(catalog, schema, table, format, location)의 뒤 두 인자는 선택 사항입니다.
| 인자 | 자료형 | 필수 | 의미 |
|---|---|---|---|
catalog | str | 예 | Unity Catalog catalog 이름 |
schema | str | 예 | catalog 안의 schema 또는 database 이름 |
table | str | 예 | 테이블 이름 |
format | Optional[str] | 아니요 | delta 또는 iceberg. 생략 시 delta |
location | Optional[str] | 아니요 | 외부 테이블의 클라우드 저장 경로 |
Databricks 표를 외부에서 읽고 쓰는 구성에는 Unity Catalog의 external access가 준비되어야 합니다. Foundry-native 접근에서 사용하는 두 출력 위치는 다음과 같습니다.
- External Delta는
location에 클라우드 디렉터리를 지정합니다.format="delta"는 기본값이므로 생략할 수 있습니다. - Managed Iceberg는
format="iceberg"로 지정합니다. 저장 위치는 Unity Catalog가 정하므로location을 지정하지 않습니다.
Databricks 안으로 계산을 보내는 pushdown은 기본 Managed Delta도 지원합니다. Databricks 실행에 세 출력 유형과 write_dataframe()의 inline 옵션을 설명했습니다. Pushdown에서는 locator 대신 "catalog.schema.table" 형식의 문자열도 사용할 수 있습니다.
DeltaTable
DeltaTable(path)는 Delta Lake 테이블의 저장 경로를 지정합니다.
| 인자 | 자료형 | 필수 | 의미 |
|---|---|---|---|
path | str | 예 | Delta 테이블의 저장 경로 |
Azure Blob Filesystem, Google Cloud Storage 또는 Amazon S3 소스와 사용할 수 있습니다.
FilesTable
FilesTable(path, format)은 클라우드 디렉터리에 파일 형식으로 저장할 표를 지정합니다.
| 인자 | 자료형 | 필수 | 의미 |
|---|---|---|---|
path | str | 예 | 파일을 저장할 폴더 경로 |
format | str | 예 | avro, csv, parquet 중 파일 형식 |
Azure Blob Filesystem, Google Cloud Storage 또는 Amazon S3 소스와 사용할 수 있습니다. DeltaTable과 달리 Delta 트랜잭션 로그를 가진 테이블을 지정하는 locator가 아닙니다.
IcebergTable
IcebergTable(table, warehouse_path=None):
| 인자 | 자료형 | 필수 | 의미 |
|---|---|---|---|
table | str | 예 | db.table 또는 catalog 표기법에 따른 전체 식별자 |
warehouse_path | Optional[str] | 아니요 | 테이블의 warehouse 저장 경로 |
연결한 소스가 지원하는 Iceberg catalog와 네임스페이스 표기법에 맞춥니다. 이 클래스는 외부 가상 테이블 locator이며 Foundry 네이티브 Iceberg 입력/출력 핸들과 구분합니다.
SnowflakeTable
SnowflakeTable(database, schema, table):
| 인자 | 자료형 | 필수 | 의미 |
|---|---|---|---|
database | str | 예 | Snowflake database 이름 |
schema | str | 예 | database 안의 schema 이름 |
table | str | 예 | 테이블 이름 |
세 인자는 모두 필수입니다. Snowflake 실행에서는 이 locator와 같은 소스의 입력을 이용해 Snowpark 또는 Snowpark Connect 세션을 구성합니다.
선언과 실행을 함께 사용하는 예
다음 경로와 RID 및 locator는 가상의 값입니다. 소스는 저장소에 가져온 실제 연결로 지정하고 외부 위치에 대한 쓰기 권한과 export controls를 준비합니다.
from transforms.api import transform
from transforms.tables import (
SnowflakeTable,
TableInput,
TableOutput,
TableTransformInput,
TableTransformOutput,
)
SOURCE_RID = "ri.magritte..source.00000000-0000-0000-0000-000000000001"
@transform.spark.using(
source_table=TableInput("/Example Project/Inputs/source_table"),
output_table=TableOutput(
"/Example Project/Outputs/output_table",
SOURCE_RID,
SnowflakeTable("DATABASE", "SCHEMA", "OUTPUT_TABLE"),
),
)
def compute(source_table: TableTransformInput, output_table: TableTransformOutput):
output_table.write_dataframe(source_table.dataframe())