Scala 调用自定义函数翻转Spark数据帧中的每一位

Scala 调用自定义函数翻转Spark数据帧中的每一位,scala,apache-spark,spark-dataframe,Scala,Apache Spark,Spark Dataframe,我有一个spark数据框,看起来像 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 |c

我有一个spark数据框,看起来像

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)
下一个0在col3处遇到,ID为A,因此新的DF看起来像

   newDF.show()    
         ID |col1|col2|col3|col4.....
         A  |0   |1   |1   |0....
    val max=myfunc(newDF) //function returns a double.
等等

注:-每0位在功能行级别翻转一次 调用重置最后翻转位效果

我试着用withcolumn调用一个UDF,但是Df内部的Df序列化问题


实际上,我调用的myfunc是为ML模型的评分而发送的,如果某个特定位被翻转,该模型将返回该用户的概率。因此,我必须遍历每个0集列,并为该特定实例将其设置为1。

我不确定您是否需要任何特别复杂的内容。假设您已经导入了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
函数以处理边缘情况或使用不同的类型(例如,如果“位”是用布尔或字符串编码的).

为什么要为其创建这么多数据帧?实际上,我调用的myfunc是为ML模型评分而发送的,如果某个特定位被翻转,该模型将返回该用户的概率(因此我必须遍历每个0集列,并为该特定实例将其设置为1..)如果我只需要翻转一些列,那么这段代码就可以正常工作,但最终我必须调用一个函数,该函数的每一行都有ML评分结果的逻辑…(0->1的每一列都必须进入myfunc),并在翻转下一列之前保留该列末尾的0。