Dar*_*ows 0 scala dataframe apache-spark 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|
+----------+----+----+----+---+---+----+---+---+-------+-------+
Run Code Online (Sandbox Code Playgroud)
我想在这个数据框上做两件事:
我目前正在这样做 -
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()
Run Code Online (Sandbox Code Playgroud)
我有一个用例,我的 targetColumns 定义如下 -
val targetColumns = Seq("T1_diff", "T2_diff")
Run Code Online (Sandbox Code Playgroud)
我需要使用上述序列将其应用到过滤器中。这是按顺序排列的,因为可以在 targetColumns 列表中添加更多列。我试过这样的事情 -
df.filter(r => !targetColumns.map(x => col(x) > 3).isEmpty).show()
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用。谁能告诉我这样做的最佳方法是什么?
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()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1310 次 |
最近记录: |