Au-delà des expectations basiques, Great Expectations permet des vérifications statistiques avancées et une intégration complète dans les pipelines CI/CD. En entretien Senior, on évalue ce niveau.
Comment utilisez-vous le profiling GE pour générer automatiquement des expectations de départ ?
import great_expectations as gx
from great_expectations.profile.basic_dataset_profiler import BasicDatasetProfiler
context = gx.get_context()
# Créer un batch depuis pandas
source = context.sources.add_pandas('pandas_source')
asset = source.add_dataframe_asset('orders')
batch = asset.add_batch_parameters(dataframe=df_orders)
# Profiling automatique : génère une suite d expectations
profiler = BasicDatasetProfiler()
suite, _ = profiler.profile(batch)
# Résultat : suite d expectations basée sur les données réelles
# - expect_column_values_to_not_be_null (si < 5% nulls)
# - expect_column_values_to_be_between (min/max observés)
# - expect_column_values_to_be_in_set (si faible cardinalité)
context.save_expectation_suite(suite)
print(f'Generated {len(suite.expectations)} expectations')Quelles expectations GE utilisez-vous pour valider la distribution statistique des données ?
batch.expect_column_mean_to_be_between('amount', min_value=40, max_value=200)
batch.expect_column_median_to_be_between('amount', min_value=30, max_value=150)
batch.expect_column_stdev_to_be_between('amount', min_value=10, max_value=500)
# Distribution : valider que les quantiles sont dans les bornes
batch.expect_column_quantile_values_to_be_between(
'amount',
quantile_ranges={
'quantiles': [0.05, 0.25, 0.50, 0.75, 0.95],
'value_ranges': [[0, 10], [15, 40], [30, 100], [80, 200], [150, 500]]
}
)
# Correlation entre colonnes
batch.expect_column_pair_values_to_be_equal(
'total_amount',
'quantity * unit_price'
)
# Distribution des catégories
batch.expect_column_most_common_value_to_be_in_set(
'status', ['completed', 'pending']
)Comment créez-vous une custom expectation pour vérifier une règle métier spécifique ?
from great_expectations.expectations.expectation import ColumnPairMapExpectation
from great_expectations.execution_engine import PandasExecutionEngine
class ExpectDeliveryDateAfterOrderDate(ColumnPairMapExpectation):
"""Delivery date must be >= order date."""
map_metric = 'column_pair_values.a_greater_than_or_equal_b'
examples = [{
'data': {
'order_date': ['2024-01-01', '2024-01-02'],
'delivery_date': ['2024-01-03', '2024-01-01']
},
'tests': [{
'title': 'delivery after order',
'expect_success': False # la 2ème ligne échoue
}]
}]
def validate_configuration(self, config):
super().validate_configuration(config)
# Utilisation dans schema.yml (via dbt-expectations style)
batch.expect_delivery_date_after_order_date(
column_A='delivery_date',
column_B='order_date'
)Comment intégrez-vous GE dans votre pipeline CI/CD pour bloquer le déploiement si les données sont mauvaises ?
## GitHub Actions : validation GE avant déploiement dbt
jobs:
data_validation:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Great Expectations
run: |
python -c "
import great_expectations as gx
context = gx.get_context(context_root_dir='./gx')
result = context.run_checkpoint('daily_validation')
if not result.success:
print('DATA QUALITY FAILED')
import sys; sys.exit(1)
"
env:
SNOWFLAKE_PASSWORD: ${{ secrets.SNOWFLAKE_PASSWORD }}
- name: Run dbt
if: success() # ne lancer dbt que si GE passe
run: dbt run --target prodComment configurez-vous des alertes GE qui notifient l équipe en cas d échec ?
## Checkpoint avec actions
checkpoint = context.add_checkpoint(
name='production_validation',
validations=[{
'batch_request': batch_request,
'expectation_suite_name': 'orders_suite'
}],
action_list=[
{
'name': 'store_validation_result',
'action': {'class_name': 'StoreValidationResultAction'}
},
{
'name': 'slack_on_failure',
'action': {
'class_name': 'SlackNotificationAction',
'slack_webhook': '${ENV:SLACK_DATA_ALERTS_WEBHOOK}',
'notify_on': 'failure',
'renderer': {
'module_name': 'great_expectations.render.renderer',
'class_name': 'SlackRenderer'
}
}
},
{
'name': 'update_data_docs',
'action': {'class_name': 'UpdateDataDocsAction'}
}
]
)Comment choisissez-vous entre Great Expectations, Soda et dbt-expectations ?
| Great Expectations | Soda | dbt-expectations | |
|---|---|---|---|
| Intégration | Python, standalone | SaaS ou CLI | Native dbt YAML |
| Complexité | Élevée | Faible | Faible |
| Expectations custom | Excellent | Limité | Bon |
| Data Docs | Natif | Via Cloud | Via dbt docs |
| Idéal pour | Règles complexes, Python-first | Simplicité, SLA | Équipes dbt-first |
| Niveau | Maitrise | Signal GO | NO-GO |
|---|---|---|---|
| Confirmé | Expectations basiques, checkpoints, Data Docs | A configuré un checkpoint avec alerte Slack | N a utilisé que les tests YAML dbt basiques |
| Senior | Profiling automatique, custom expectations, CI/CD bloquant | A créé des custom expectations, a intégré GE dans GitHub Actions | Ne sait pas créer une custom expectation |
Premier entretien gratuit. Rapport GO/NO-GO sous 48h.