如何将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
汇总一个包含所有可能角色的列表。然后 isEditor
和 isManager
列根据角色是否在列表中使用内置的 array_contains
方法设置为 true 或 false。最后,包含角色列表的临时 Roles
列被删除。
我是 Spark 和 Whosebug 的新手,正在尝试弄清楚这个问题,不确定我的主题是否可以描述。任何 help/suggestion 将不胜感激。
我有两个数据集,一个只有 ID,如下所示:
ID
111
222
另一个包含ID,parent_ID和Role,其中parent_ID链接到前面table,
中的IDID 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
汇总一个包含所有可能角色的列表。然后 isEditor
和 isManager
列根据角色是否在列表中使用内置的 array_contains
方法设置为 true 或 false。最后,包含角色列表的临时 Roles
列被删除。