Databricks - 如何将 table 与包含在 struct<array<string>> 类型列中的 ID 连接

Databricks - How to join a table with IDs contained in a column of type struct<array<string>>

我目前有 JSON 个文件,我可以通过该文件将其数据转储到临时视图中。遵循 Python (PySpark) 逻辑:

 departMentData = spark \
                .read \
                .option("multiLine", True) \
                .option("mode", "PERMISSIVE") \
                .json("C:\Test\data.json") \
                .createOrReplaceTempView("vw_TestView")

这个临时视图在一个数组中包含部门数据和该部门内的员工列表。一名员工可以隶属于多个部门。

以下是此视图的数据类型:

vw_TestView的table数据如下

DeptID DeptName EmployeeIDs
D01 dev ["U1234", "U6789"]
D02 qa ["U1234", "U2345"]

和另一个 table Employees 拥有所有这些员工的详细信息如下:

EmpID EmpName
U1234 jon
U6789 smith
U2345 natasha

我需要新 table 的最终输出如下:

DeptID DeptName EmployeeIDs EmployeeNames
D01 dev ["U1234", "U6789"] ["jon", "smith"]
D02 qa ["U1234", "U2345"] ["jon", "natasha"]

如何在 Databricks SQL 或 PySPark 中执行此类连接?

您可以尝试以下操作,它使用 explode 将员工 ID 列表拆分为不同的行,然后加入它们并使用 collect_list 将条目聚合到列表中。

使用火花 sql:

NB. 确保 Employees 可用作 table/view 例如 EmployeeData.createOrReplaceTempView("Employees")

WITH dept_employees AS (
    SELECT
        DeptId,
        DeptName,
        explode(EmployeeIDs)
    FROM
        vw_TestView
)
SELECT
    d.DeptId,
    d.DeptName,
    collect_list(e.EmpID) as EmployeeIDs,
    collect_list(e.EmpName) as EmployeeNames
FROM
    dept_employees d
INNER JOIN
    Employees e ON d.col=e.EmpID
GROUP BY
    d.Deptid,
    d.DeptName

或使用 pyspark api:

from pyspark.sql import functions as F

output_df = (
    departMentData.select(
        F.col("DeptId"),
        F.col("DeptName"),
        F.explode("EmployeeIDs")
    )
    .alias("d")
    .join(
        EmployeeData.alias("e"),
        F.col("d.col")==F.col("e.EmpID"),
        "inner"
    )
    .groupBy("d.DeptId","d.DeptName")
    .agg(
        F.collect_list("e.EmpID").alias("EmployeeIDs"),
        F.collect_list("e.EmpName").alias("EmployeeNames")
    )
)

让我知道这是否适合你。