我有一个看起来像
的火花数据帧ID |col1|col2|col3|col4.....
A |0 |1 |0 |0....
C |1 |0 |0 |0.....
E |1 |0 |1 |1......
ID是唯一键,其他列的二进制值为0/1 现在,我想迭代每一行,如果列值为0,我想应用一些函数将这一行作为数据框传递给该函数 类似于ID A的上述数据帧中的col1 == 0 现在行的DF应该看起来像
newDF.show()
ID |col1|col2|col3|col4.....
A |1 |1 |0 |0....
myfunc(newDF)
在col3处遇到ID为A的下一个0,所以新的DF看起来像
newDF.show()
ID |col1|col2|col3|col4.....
A |0 |1 |1 |0....
val max=myfunc(newDF) //function returns a double.
等......
注意: - 每个0位在行级翻转一次以获得功能 调用重置最后翻转的位效果
P.S: - 我尝试使用withcolumn调用UDF但DF内部的Df序列化问题
实际上myfunc我的呼叫是为ML模型发送得分,如果特定位被翻转,我会返回该用户的概率。所以我必须遍历每个0集列广告设置为1那个特殊的例子。
答案 0 :(得分:0)
我不确定你需要什么特别复杂的东西。鉴于您已导入SQL函数并且会话隐含
val spark: SparkSession = ??? // your session
import spark.implicits._
import org.apache.spark.sql.functions._
你应该能够通过应用以下功能“翻转位”(虽然我假设它们实际上被编码为数字)
def flip(col: Column): Column = when(col === 1, lit(0)).otherwise(lit(1))
如本例所示
df.select($"ID", flip($"col1") as "col1", flip($"col2") as "col2")
您可以轻松地重写flip
函数来处理边缘情况或使用不同的类型(例如,如果“位”用布尔值或字符串编码)。