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")
这个临时视图在一个数组中包含部门数据和该部门内的员工列表。一名员工可以隶属于多个部门。
以下是此视图的数据类型:
- 部门ID:字符串
- 部门名称:字符串
- EmployeeIDs: array
和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")
)
)
让我知道这是否适合你。
我目前有 JSON 个文件,我可以通过该文件将其数据转储到临时视图中。遵循 Python (PySpark) 逻辑:
departMentData = spark \
.read \
.option("multiLine", True) \
.option("mode", "PERMISSIVE") \
.json("C:\Test\data.json") \
.createOrReplaceTempView("vw_TestView")
这个临时视图在一个数组中包含部门数据和该部门内的员工列表。一名员工可以隶属于多个部门。
以下是此视图的数据类型:
- 部门ID:字符串
- 部门名称:字符串
- EmployeeIDs: array
和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")
)
)
让我知道这是否适合你。