如何将reduce/merge一对多关系数据集转换成另一个数据集作为一列

How to reduce/merge one-to-many relationship dataset into another dataset as one column

我是 Spark 和 Whosebug 的新手,正在尝试弄清楚这个问题,不确定我的主题是否可以描述。任何 help/suggestion 将不胜感激。

我有两个数据集,一个只有 ID,如下所示:

ID
111
222

另一个包含ID,parent_ID和Role,其中parent_ID链接到前面table,

中的ID
ID      Parent_ID      Role
444      111           Editor
555      111           Manager
666      222           Editor

我要生成的数据集是这样的:

ID   isEditor   isManager
111   True       True
222   True       False

我本来想的是用id/parent-id连接两个table,然后reduce/merge多行合二为一,但是reduce/merge部分有问题。

任何 help/suggestion 将不胜感激。

这可以通过只使用第二个数据框来解决,第一个不是必需的。使用与问题中相同的数据:

val df = Seq((444, 111, "Editor"), (555, 111, "Manager"), (666, 222, "Editor")).toDF("ID", "Parent_ID", "Role") 

val df2 = df.groupBy("Parent_ID").agg(collect_list($"Role").as("Roles"))
  .withColumn("isEditor", when(array_contains($"Roles", "Editor"), "True").otherwise("False"))
  .withColumn("isManager", when(array_contains($"Roles", "Manager"), "True").otherwise("False"))
  .drop("Roles")

这将给出所需的结果:

+---------+--------+---------+
|Parent_ID|isEditor|isManager|
+---------+--------+---------+
|      222|    True|    False|
|      111|    True|     True|
+---------+--------+---------+

解决方案首先为每个 Parent_ID 汇总一个包含所有可能角色的列表。然后 isEditorisManager 列根据角色是否在列表中使用内置的 array_contains 方法设置为 true 或 false。最后,包含角色列表的临时 Roles 列被删除。