对于下面给定的输入df,我试图在spark中输出低于输出df,即添加新列" new1"在输出df和new1列的值是这样的,如果它们小于fn值和id值,它应该包含前面所有行的非值fn列值。
input df:
+---+---+
| id| fn|
+---+---+
| 1| 0|
| 1| 0|
| 2| 0|
| 2| 0|
| 3| 4|
| 5| 0|
| 5| 0|
| 6| 7|
+---+---+
output wanted is:
+---+---+----+
| id| fn|new1|
+---+---+----+
| 1| 0| 4|
| 1| 0| 4|
| 2| 0| 4|
| 2| 0| 4|
| 3| 4| 4|
| 5| 0| 7|
| 5| 0| 7|
| 6| 7| 7|
+---+---+----+
答案 0 :(得分:0)
感谢您的回复。 我使用了udf(我本来可以使用上面的第一个回复,但因为我有更多的逻辑要合并,因此我使用udf进行简单阅读)。
我所做的代码如下,这对我的问题很好。
val df = Seq((1, 0), (1, 0), (2, 0), (2, 0), (3, 4),(5, 0), (5, 0), (6, 7)).toDF("id", "fn")
val df1 = df.filter(df("fn") > 0)
val fn_value_list = df1.select("fn").rdd.map(r => r(0)).collect.toList
fn_value_list.foreach(println)
def udfFunc(idval : Int, fnval : Int) : Int = {
for(fn_val_list <- fn_value_list) {
if(idval <= fn_val_list.asInstanceOf[Int] && fnval <= fn_val_list.asInstanceOf[Int])
return fn_val_list.asInstanceOf[Int]
}
return fnval
}
val myUdf = udf(udfFunc _)
var df10 = df.withColumn("new1", myUdf(df("id"), df("fn")))
df10.show