Spark

Bucketing : pré-shuffler une table de jointure récurrente

Tables bucketées sur la même clé et le même nombre de buckets : les jointures et agrégations suivantes évitent le shuffle.

Cas d'usage

Étoile fact/dimension jointe quotidiennement sur la même clé.

Prérequis

PySpark 3.x, metastore (Hive/Glue)

Python
(
    facts.write
    .bucketBy(64, "customer_id")
    .sortBy("customer_id")
    .mode("overwrite")
    .saveAsTable("silver.facts_bucketed")     # bucketing => saveAsTable
)

(
    customers.write
    .bucketBy(64, "customer_id")              # même clé, même nombre
    .mode("overwrite")
    .saveAsTable("silver.customers_bucketed")
)

# Le join suivant ne déclenche AUCUN Exchange (vérifier avec explain)
j = spark.table("silver.facts_bucketed") \
         .join(spark.table("silver.customers_bucketed"), "customer_id")

Résultat

>>> j.explain()
== Physical Plan ==
*(3) SortMergeJoin [customer_id#4], [customer_id#21], Inner
:- *(1) Sort [customer_id#4 ASC NULLS FIRST], false, 0
:  +- FileScan parquet silver.facts_bucketed ... SelectedBucketsCount: 64 out of 64
+- *(2) Sort [customer_id#21 ASC NULLS FIRST], false, 0
   +- FileScan parquet silver.customers_bucketed ... SelectedBucketsCount: 64 out of 64

Aucun Exchange dans le plan : zero shuffle sur la jointure.
PySparkBucketingShuffleMetastore

Snippets liés

Retour au Data Lab