Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何将一对多关系数据集缩减/合并到另一个数据集中作为一列_Apache Spark_Spark Dataframe - Fatal编程技术网

Apache spark 如何将一对多关系数据集缩减/合并到另一个数据集中作为一列

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

我对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      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列就可以解决这个问题,这使得第一个数据集变得不必要(因此我问你为什么需要加入)。工作顺利!谢谢