在scalaDataframe中查找顶级父级

xfb7svmp  于 2021-07-12  发布在  Spark
关注(0)|答案(1)|浏览(302)

我需要为spark数据框中的一些数据找到最上面的父id。
我确实有两列,如下所示,分别是object id和parent object id。

对象id 123的父对象id为456,也是父id为789的对象id……以此类推。
要求是为每个对象id找到最顶层的父对象。
预期输出如下所示。

我尝试创建temp表并用while循环重写该表。但这似乎是不正常的工作。
有没有办法达到这个要求?任何线索感谢!
使用下面问题中提供的解决方案进行了尝试,但它持续执行了很长一段时间,好像在一个无限循环中的某个地方!sparkDataframe:查找并设置子级的主根

jtoj6r0c

jtoj6r0c1#

如果知道层次结构的“深度”,可以使用 foldLeft 把一系列的 self-join s、 如下图所示:

val df = Seq(
  (123, 456), (145, 111), (456, 789), (789, 999), (787, 676)
).toDF("obj", "obj_parent")

val depth = 3

(1 to depth).foldLeft(df){ (accDF, _) =>
  accDF.as("df1").
    join(df.as("df2"), $"df1.obj_parent" === $"df2.obj", "left_outer").
    select($"df1.obj".as("obj"), coalesce($"df2.obj_parent", $"df1.obj_parent").as("obj_parent"))
}.show
// +---+----------+
// |obj|obj_parent|
// +---+----------+
// |123|       999|
// |145|       111|
// |456|       999|
// |789|       999|
// |787|       676|
// +---+----------+

请注意,即使提供的“depth”值大于实际的层次深度,它也可以正常工作,尽管在这种情况下,一些后续转换是多余的。

相关问题