lateralJoin
Jointures latérales avec un autre DataFrame, en utilisant l'expression de jointure donnée.
Syntaxe
lateralJoin(other: "DataFrame", on: Optional[Column] = None, how: Optional[str] = None)
parameter
parameter | Type | Description |
|---|---|---|
| DataFrame | Côté droit de la jointure. |
| Colonne, facultative | une expression de jointure (colonne). |
| str, facultatif | default |
Renvoie
DataFrame: DataFrame joint.
Notes
Une jointure latérale (également appelée jointure corrélée) est un type de jointure où chaque ligne d'un DataFrame est utilisée comme entrée d'une sous-requête ou d'une table dérivée qui calcule un résultat spécifique à cette ligne. Le côté droit DataFrame peut faire référence à des colonnes de la ligne actuelle du côté gauche DataFrame, permettant des résultats plus complexes et dépendants du contexte qu'une jointure standard.
Exemples
from pyspark.sql import functions as sf
from pyspark.sql import Row
customers_data = [
Row(customer_id=1, name="Alice"), Row(customer_id=2, name="Bob"),
Row(customer_id=3, name="Charlie"), Row(customer_id=4, name="Diana")
]
customers = spark.createDataFrame(customers_data)
orders_data = [
Row(order_id=101, customer_id=1, order_date="2024-01-10",
items=[Row(product="laptop", quantity=5), Row(product="mouse", quantity=12)]),
Row(order_id=102, customer_id=1, order_date="2024-02-15",
items=[Row(product="phone", quantity=2), Row(product="charger", quantity=15)]),
Row(order_id=105, customer_id=1, order_date="2024-03-20",
items=[Row(product="tablet", quantity=4)]),
Row(order_id=103, customer_id=2, order_date="2024-01-12",
items=[Row(product="tablet", quantity=8)]),
Row(order_id=104, customer_id=2, order_date="2024-03-05",
items=[Row(product="laptop", quantity=7)]),
Row(order_id=106, customer_id=3, order_date="2024-04-05",
items=[Row(product="monitor", quantity=1)]),
]
orders = spark.createDataFrame(orders_data)
customers.join(orders, "customer_id").lateralJoin(
spark.tvf.explode(sf.col("items").outer()).select("col.*")
).select(
"customer_id", "name", "order_id", "order_date", "product", "quantity"
).orderBy("customer_id", "order_id", "product").show()
# +-----------+-------+--------+----------+-------+--------+
# |customer_id| name|order_id|order_date|product|quantity|
# +-----------+-------+--------+----------+-------+--------+
# | 1| Alice| 101|2024-01-10| laptop| 5|
# | 1| Alice| 101|2024-01-10| mouse| 12|
# ...
# +-----------+-------+--------+----------+-------+--------+