Spark将函数应用于某些列

时间:2017-05-16 12:14:12

标签: apache-spark dataframe

我有一个包含N列的数据框,我有一个hashmap,其中键是列名称,值是元组(字符串,布尔值)。

对于hasmap上的每一列并满足某个条件 - 与元组的一些比较 - 我必须将一个函数应用于该列的所有元素。

最后,我必须根据列名修改满足某些条件的数据帧的某些列。

这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

您可以尝试在hashmap上使用foldLeft。这是Scala的一个例子:

import org.apache.spark.sql.Column
import org.apache.spark.sql.functions._

val colMap = Map(
  "col1" -> ("a", true),
  "col2" -> ("a", true),
  "col3" -> ("a", false)
)

val df = Seq((1, 1, 1), (2, 2, 2)).toDF("col1", "col2", "col3")

def verify(strValue: String, boolValue: Boolean): Boolean = {
  strValue == "a" && boolValue
}
def processColumn(c: Column): Column = c * 2

colMap.foldLeft(df) {
  case (curDF, (colName, (strValue, boolValue))) => 
    if(verify(strValue, boolValue)) curDF.withColumn(colName, processColumn(col(colName)))
    else curDF
}