【问题标题】:Find Top Parent in Scala Data Frame在 Scala 数据框中查找顶级父级
【发布时间】:2021-03-05 13:53:30
【问题描述】:

我需要为 spark 数据框中的某些数据找到最顶层的父 id。

我确实有两列,如下所示,带有对象 ID 和父对象 ID。

object id 123 的父 obj id 为 456 并且它是一个对象 id,其父 id 为 789 ...并且以此类推。

要求是为每个对象 id 找到最顶层的父对象。

预期的输出如下所示。

我尝试创建临时表并使用 while 循环重写该表。但它似乎无法正常工作。

有什么方法可以达到这个要求吗?任何线索表示赞赏!

尝试使用以下问题中提供的解决方案,但它会持续执行很长时间,似乎在某个地方处于无限循环中! Spark DataFrame: find and set the main root for child

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    如果您知道层次结构的“深度”,则可以使用foldLeft 聚合一系列self-joins,如下所示:

    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|
    // +---+----------+
    

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多