Transformacao customizada no Databricks
Este exemplo mostra como manter o ContractForge como fronteira de contrato, enquanto um notebook Databricks executa um tratamento complexo entre varias tabelas.
O projeto completo esta em
examples/real-world/databricks-movie-custom-transform.
Quando usar este padrao
Use source.type: custom_transform quando uma transformacao fica mais clara em
codigo revisado do que em YAML declarativo:
- joins entre multiplas entradas;
- engenharia de features;
- metricas agrupadas ou com janelas;
- bibliotecas externas;
- regras de negocio que precisam de revisao de codigo.
O notebook e uma vinculacao nativa do Databricks. O contrato continua dono das entradas, saida esperada, destino, modo de escrita, qualidade, anotacoes, operacoes, evidencias e versionamento de deploy.
Fluxo de execucao
contrato bronze_movie_ratings
contrato bronze_movie_titles
|
contrato silver_movie_ratings
|
notebook Databricks: prepare_movie_features.py
|
contrato gold_movie_feature_summary custom_transform
|
validacao, escrita, evidencia e versionamento pelo ContractForge
O Databricks Asset Bundle conecta o notebook como uma task nativa:
- task_key: prepare_movie_features
notebook_task:
notebook_path: ./notebooks/prepare_movie_features.py
base_parameters:
ratings_table: workspace.cf_movie_silver.s_movie_ratings
movies_table: workspace.cf_movie_bronze.b_movie_titles
output_table: workspace.cf_movie_tmp.movie_feature_engineering_output
min_ratings: "10"
A task gold do ContractForge depende dessa task de notebook.
Contrato gold
source:
type: custom_transform
intent: custom_treatment
inputs:
- alias: ratings
table: workspace.cf_movie_silver.s_movie_ratings
- alias: movies
table: workspace.cf_movie_bronze.b_movie_titles
target:
table: g_movie_feature_summary
layer: gold
mode: overwrite
transform:
custom:
name: movie_genre_feature_engineering
output: workspace.cf_movie_tmp.movie_feature_engineering_output
expected_columns:
- genre
- rating_band
- rating_count
- movie_count
- user_count
- avg_rating
- rating_stddev
- computed_at_utc
parameters:
min_ratings: 10
quality_rules:
not_null: [genre, rating_band, rating_count, avg_rating]
expressions:
- name: positive_rating_count
expression: rating_count > 0
severity: abort
message: Gold feature rows must represent at least one rating.
- name: valid_average_rating
expression: avg_rating BETWEEN 0 AND 5
severity: abort
message: Average rating must stay in the source rating scale.
extensions:
databricks:
custom_transform:
notebook_path: ./notebooks/prepare_movie_features.py
task_key: prepare_movie_features
output_table: workspace.cf_movie_tmp.movie_feature_engineering_output
base_parameters:
ratings_table: workspace.cf_movie_silver.s_movie_ratings
movies_table: workspace.cf_movie_bronze.b_movie_titles
output_table: workspace.cf_movie_tmp.movie_feature_engineering_output
min_ratings: "10"
delta_properties:
delta.enableChangeDataFeed: "true"
Deploy
O exemplo usa pacotes PyPI no ambiente do job Databricks:
dependencies:
- contractforge-core
- contractforge-databricks
Execute com Databricks Asset Bundles:
databricks bundle validate
databricks bundle deploy
databricks bundle run movie_custom_transform
Se o workspace nao puder instalar a partir do PyPI, substitua as dependencias por caminhos de wheels publicados nos artefatos de release.