Apache spark 如何将一对多关系数据集缩减/合并到另一个数据集中作为一列
我对Spark和Stackoverflow是个新手,我试图弄明白这个问题,不确定我的主题是否可以描述。如有任何帮助/建议,将不胜感激 我有两个数据集,一个只有ID,如下所示:Apache spark 如何将一对多关系数据集缩减/合并到另一个数据集中作为一列,apache-spark,spark-dataframe,Apache Spark,Spark Dataframe,我对Spark和Stackoverflow是个新手,我试图弄明白这个问题,不确定我的主题是否可以描述。如有任何帮助/建议,将不胜感激 我有两个数据集,一个只有ID,如下所示: ID 111 222 ID isEditor isManager 111 True True 222 True False 另一个包含ID、parent_ID和Role,其中parent_ID链接到上一个表中的ID ID Parent_ID Role 444
ID
111
222
ID isEditor isManager
111 True True
222 True False
另一个包含ID、parent_ID和Role,其中parent_ID链接到上一个表中的ID
ID Parent_ID Role
444 111 Editor
555 111 Manager
666 222 Editor
我要生成的数据集如下所示:
ID
111
222
ID isEditor isManager
111 True True
222 True False
我最初的想法是通过id/父id连接两个表,然后将多行缩减/合并为一行,但在缩减/合并部分遇到问题
任何帮助/建议都将不胜感激。仅使用第二个数据帧即可解决此问题,第一个数据帧不是必需的。使用与问题中相同的数据:
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|
+---------+--------+---------+
解决方案首先为每个
父ID
聚合一个包含所有可能角色的列表。然后,isEditor
和isManager
列被设置为true或false,这取决于角色是否在列表中,是否使用内置的array\u contains
方法。最后,包含角色列表的临时Roles
列被删除。为什么需要第一个表?你不能按父id分组并从那里开始吗?前两个表是我从csv文件中获得的数据集。它包含一些其他列,但与我的问题无关,所以我没有提到它们。因此,对于这个问题,您实际上不需要第一个数据集。对吗?我需要它,想要生成的数据集需要包含我没有提到的所有其他列。为了重新表述我的问题,我需要在第一个数据集中再添加两列:“iEdit”和“iManager”,列的值(True或False)基于第二个数据集中的数据。当然可以。但对于这个问题,重点似乎是如何添加这两列。连接本身没有那么有趣,对吗?否则,需要更多信息,即当ID存在于第一个数据帧中而不存在于第二个数据帧中时会发生什么,反之亦然。正如当前的问题所示,仅使用第二个数据集的parent_id和role列就可以解决这个问题,这使得第一个数据集变得不必要(因此我问你为什么需要加入)。工作顺利!谢谢