Apache spark Spark:根据条件使用列表中的值更新列
对于下面给定的输入df,我尝试在spark中输出低于输出df的值,即在输出df中添加新列“new1”,并且new1列的值应为,如果它们小于fn值和id值,则它应该包含前面所有行的fn列值的非值Apache spark Spark:根据条件使用列表中的值更新列,apache-spark,Apache Spark,对于下面给定的输入df,我尝试在spark中输出低于输出df的值,即在输出df中添加新列“new1”,并且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: +---
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|
+---+---+----+
谢谢你的回复。
我使用了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
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.过滤器(df(“fn”)>0)
val fn_value_list=df1.select(“fn”).rdd.map(r=>r(0)).collect.toList
fn\u值\u列表。foreach(println)
def udfFunc(idval:Int,fnval:Int):Int={
对于(fn_val_list)为什么不使用withColumn
withwhen
…df.withColumn(“new1”),when(col”(“fn”)如果列表中有多个元素呢?我们可以举个例子吗?问题不清楚,请编辑您的问题并在那里添加详细信息,然后删除此答案。