【问题标题】:spark scala transform a dataframe/rddspark scala 转换数据帧/rdd
【发布时间】:2019-05-24 09:51:32
【问题描述】:

我有一个如下所示的 CSV 文件。

PK,key,Value
100,col1,val11
100,col2,val12
100,idx,1
100,icol1,ival11
100,icol3,ival13
100,idx,2
100,icol1,ival21
100,icol2,ival22
101,col1,val21
101,col2,val22
101,idx,1
101,icol1,ival11
101,icol3,ival13
101,idx,3
101,icol1,ival31
101,icol2,ival32

我想把它变成下面这样。

PK,idx,key,Value
100,,col1,val11
100,,col2,val12
100,1,idx,1
100,1,icol1,ival11
100,1,icol3,ival13
100,2,idx,2
100,2,icol1,ival21
100,2,icol2,ival22
101,,col1,val21
101,,col2,val22
101,1,idx,1
101,1,icol1,ival11
101,1,icol3,ival13
101,3,idx,3
101,3,icol1,ival31
101,3,icol2,ival32

基本上,我想在输出数据框中创建一个名为 idx 的新列,该列将填充与 key=idx, value="n" 之后的行相同的值“n”。

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    这是在 Spark >= 2.0.0 中使用 last 窗口函数的一种方法:

    import org.apache.spark.sql.functions.{last, when, lit}
    import org.apache.spark.sql.expressions.Window
    
    val w = Window.partitionBy("PK").rowsBetween(Window.unboundedPreceding, 0)
    
    df.withColumn("idx", when($"key" === lit("idx"), $"Value"))
      .withColumn("idx", last($"idx", true).over(w))
      .orderBy($"PK")
      .show
    

    输出:

    +---+-----+------+----+
    | PK|  key| Value| idx|
    +---+-----+------+----+
    |100| col1| val11|null|
    |100| col2| val12|null|
    |100|  idx|     1|   1|
    |100|icol1|ival11|   1|
    |100|icol3|ival13|   1|
    |100|  idx|     2|   2|
    |100|icol1|ival21|   2|
    |100|icol2|ival22|   2|
    |101| col1| val21|null|
    |101| col2| val22|null|
    |101|  idx|     1|   1|
    |101|icol1|ival11|   1|
    |101|icol3|ival13|   1|
    |101|  idx|     3|   3|
    |101|icol1|ival31|   3|
    |101|icol2|ival32|   3|
    +---+-----+------+----+
    

    代码首先创建一个名为idx 的新列,当key == idx 时包含Value 的值,否则为null。然后它检索在定义的窗口上观察到的last idx

    【讨论】:

    • 酷。谢谢,工作正常。由于某种原因 $"column_name" 对我不起作用,但 col("column_name") 工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2020-09-06
    相关资源
    最近更新 更多