过滤列表中定义的列上的数据帧

时间:2018-04-25 05:11:52

标签: scala apache-spark dataframe apache-spark-sql

我有一个数据框 DF

+----------+----+----+----+---+---+----+---+---+-------+-------+
|      WEEK|DIM1|DIM2|  T1| T2| T3|  T1| T2| T3|T1_diff|T2_diff|
+----------+----+----+----+---+---+----+---+---+-------+-------+
|2016-04-02|  14|NULL|9874|880| 23|9879|820| 45|     -5|     60|
|2016-04-30|  14|  FR|9875| 13| 34|9785|  9| 67|     90|      4|
+----------+----+----+----+---+---+----+---+---+-------+-------+

我想在这个数据框上做两件事:

  1. 仅选择WEEK,DIM1,DIM2,T1_diff,T2_diff
  2. 过滤器T1_diff或T2_diff> 3
  3. 我目前正在这样做 -

    val selectColumns = Seq("WEEK", "DIM1", "DIM2","T1_diff","T2_diff")
    df.select(selectColumns.head, selectColumns.tail: _*).filter($"T1_diff" > 3 or $"T2_diff" > 3).show()
    

    我有一个用例,我的targetColumns定义如下 -

    val targetColumns = Seq("T1_diff", "T2_diff")
    

    我需要使用上面的序列将它应用于过滤器。这是顺序的,因为可以在targetColumns列表中添加更多列。 我试过这样的事情 -

    df.filter(r => !targetColumns.map(x => col(x) > 3).isEmpty).show()
    

    这似乎不起作用。谁能告诉我这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:4)

您可以在将每个目标列映射到某个条件(reduce)之后对目标列序列使用col(name) > 3,并使用or将它们“合并”为一个条件:

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

val selectColumns = Seq("id", "type", "DIM2","T1_diff","T2_diff")
val targetColumns = Seq("T1_diff", "T2_diff")

df.select(selectColumns.head, selectColumns.tail: _*)
  .filter(targetColumns.map(name => col(name) > 3).reduce(_ or _))
  .show()

答案 1 :(得分:1)

您可以使用targetColumns List创建字符串,然后将该字符串传递给where函数。

val targetColumns = List("T1_diff", "T2_diff")
val selectColumns = Seq("WEEK", "DIM1", "DIM2", "T1_diff", "T2_diff")

//create the where condition to filter the columns
val condition = targetColumns.map(c => s"$c>3").mkString(" OR ")

//select the columns and apply filter using where function.
df.select(selectColumns.head, selectColumns.tail: _*).where(condition).show(false)

答案 2 :(得分:1)

您只需执行以下操作string query

即可
val targetColumns = Seq("T1_diff", "T2_diff")

df.filter(targetColumns.map(x => s"$x > 3").mkString(" or ")).show()

您可以根据需要在targetColumns中添加任意数量的列