боковое задание

Боковое соединение с другим кадром данных с помощью заданного выражения соединения.

Синтаксис

lateralJoin(other: "DataFrame", on: Optional[Column] = None, how: Optional[str] = None)

Параметры

Параметр Тип Описание
other DataFrame Справа от соединения.
on Столбец, необязательный выражение соединения (столбец).
how str, необязательный по умолчанию inner. Должен быть одним из следующих: inner, cross, leftи leftouterleft_outer.

Возвраты

DataFrame: присоединенный кадр данных.

Примечания

Боковое соединение (также известное как сопоставленное соединение) — это тип соединения, в котором каждая строка из одного кадра данных используется в качестве входных данных для подзапроса или производной таблицы, которая вычисляет результат, характерный для этой строки. Правая сторона может ссылаться на столбцы из текущей строки левой стороны DataFrameDataFrame, что позволяет получить более сложные и зависимые от контекста результаты, чем стандартное соединение.

Примеры

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|
# ...
# +-----------+-------+--------+----------+-------+--------+