将逻辑/功能应用于Spark Dataframe列的“子集”

时间:2019-03-09 18:16:38

标签: apache-spark

我想通过传递cols列表以适应除ID以外的所有条件来适应以下情况。无论我做什么,cols,Row等都会出错。使用所有列并选择一个子集都可以,但是就功能而言,不是一个子集。

val df = sc.parallelize(Seq(
   ("r1", 1, 1),
   ("r2", 6, 4),
   ("r3", 4, 1),
   ("r4", 1, 2)
   )).toDF("ID", "a", "b")

val ones = df.columns.drop(1).map(x => when(col(x) === 1, 1).otherwise(0)).reduce(_ + _)
df.withColumn("ones", ones).show

寻求指导。预先感谢。

1 个答案:

答案 0 :(得分:1)

上面的代码对我有用。我不确定您要尝试的方法是否奏效。您是否只想在某些行中检查?在功能上?

def sumOnes(df: DataFrame, columnNames: Seq[String]): DataFrame = {
  val ones = columnNames.map(x => when(col(x) === 1, 1).otherwise(0)).reduce(_ + _)
  df.withColumn("ones", ones)
}
sumOnes(df, Seq("a")).show

+---+---+---+----+
| ID|  a|  b|ones|
+---+---+---+----+
| r1|  1|  1|   1|
| r2|  6|  4|   0|
| r3|  4|  1|   0|
| r4|  1|  2|   1|
+---+---+---+----+
sumOnes(df, Seq("b")).show

+---+---+---+----+
| ID|  a|  b|ones|
+---+---+---+----+
| r1|  1|  1|   1|
| r2|  6|  4|   0|
| r3|  4|  1|   1|
| r4|  1|  2|   0|
+---+---+---+----+
sumOnes(df, Seq("a", "b")).show

+---+---+---+----+
| ID|  a|  b|ones|
+---+---+---+----+
| r1|  1|  1|   2|
| r2|  6|  4|   0|
| r3|  4|  1|   1|
| r4|  1|  2|   1|
+---+---+---+----+