【问题标题】:How to explode Spark dataframe Array field with Unique identifiers in Scala?如何在 Scala 中使用唯一标识符分解 Spark 数据帧数组字段?
【发布时间】:2018-09-22 02:43:05
【问题描述】:

我有一个如下的数据框:

+-----------+
|        f1 |
+-----------+
|[a,b,c]    |
|[e,f,g]    |
|[h,i]      |
+-----------+

我想将它与重复的唯一数字字段一起分解为行,如下所示:

+-----------+--------+
|        f1 |     uid|
+-----------+--------+
|a          |       1|
|b          |       1|
|c          |       1|
|e          |       2|
|f          |       2|
|g          |       2|
|h          |       3|
|i          |       3|
+-----------+--------+

我可以按照这里的说明直接执行爆炸 - Spark: Explode a dataframe array of structs and append id

但我不确定如何将 uid 字段添加到新数据框,以便每个展开的数组字段具有相同的 uid 而其他元素具有不同的 uid 值。

【问题讨论】:

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


    【解决方案1】:

    正确的做法是使用monotonically_increasing_id

    val df = Seq(Seq("a", "b", "c"), Seq("e", "f", "g"), Seq("h", "i")).toDF("f1")
    
    df
      .withColumn("uid", monotonically_increasing_id)
      .withColumn("f1", explode($"f1"))
      .show
    // +---+---+                                                                       
    // | f1|uid|
    // +---+---+
    // |  a|  0|
    // |  b|  0|
    // |  c|  0|
    // |  e|  1|
    // |  f|  1|
    // |  g|  1|
    // |  h|  2|
    // |  i|  2|
    // +---+---+
    

    数字不必像示例中那样连续,但会唯一标识来源。

    不要使用rank().over(Window.orderBy("f1"))。它本质上是顺序的,不可扩展,除了本地 Datasets (即从 isLocal 返回 true 的那个)外,应该避免这种情况。

    【讨论】:

    • 所以我觉得你不...有趣。在使用 DF 和 DS 进行引擎盖优化的过程中,除了宣传之外什么都没有。你说的正好相反,我同意。
    猜你喜欢
    • 1970-01-01
    • 2016-11-14
    • 2018-10-12
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多