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

时间:2018-02-17 05:51:47

标签: scala apache-spark spark-dataframe

我有一个看起来像

的火花数据帧
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那个特殊的例子。

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函数来处理边缘情况或使用不同的类型(例如,如果“位”用布尔值或字符串编码)。