如何在某个值'b'之前找到值'a'的上一次出现

时间:2017-07-24 01:01:51

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

我加入两个数据帧并得到如下结果数据框。现在我想要

+---------+-----------+-----------+-------------------+---------+-------------------+
|a        |b          |       c   |          d        |       e |          f |
+---------+-----------+-----------+-------------------+---------+-------------------+
|        7|          2|          1|2015-04-12 23:59:01|     null|              null |
|       15|          2|          2|2015-04-12 23:59:02|         |                   |
|       11|          2|          4|2015-04-12 23:59:03|     null|               null|
|        3|          2|          4|2015-04-12 23:59:04|     null|               null|
|        8|          2|          3|2015-04-12 23:59:05| {NORMAL} 2015-04-12 23:59:05|
|       16|          2|          3|2017-03-12 23:59:06|     null|               null|
|        5|          2|          3|2015-04-12 23:59:07|     null|               null|
|       18|          2|          3|2015-03-12 23:59:08|     null|               null|
|       17|          2|          1|2015-03-12 23:59:09|     null|               null|
|        6|          2|          1|2015-04-12 23:59:10|     null|               null|
|       19|          2|          3|2015-03-12 23:59:11|     null|               null|
|        9|          2|          3|2015-04-12 23:59:12|     null|               null|
|        1|          2|          2|2015-04-12 23:59:13|     null|               null|
|        1|          2|          2|2015-04-12 23:59:14|     null|               null|
|        1|          2|          2|2015-04-12 23:59:15|     null|               null|
|       10|          3|          2|2015-04-12 23:59:16|     null|               null|
|        4|          2|          3|2015-04-12 23:59:17| {NORMAL}|2015-04-12 23:59:17|
|       12|          3|          1|2015-04-12 23:59:18|     null|               null|
|       13|          3|          1|2015-04-12 23:59:19|     null|               null|
|       14|          2|          1|2015-04-12 23:59:20|     null|               null|
+---------+-----------+-----------+-------------------+---------+-------------------+

现在我必须在c列中的每个3之前找到第一个出现的1。例如

|        4|          2|          3|2015-04-12 23:59:17| {NORMAL}|2015-04-12 23:59:17|

在此记录之前,我想知道列c中第一个出现的1是

|       17|          2|          1|2015-03-12 23:59:09|     null|               null|

感谢任何帮助

1 个答案:

答案 0 :(得分:1)

您可以使用Spark窗口函数滞后import org.apache.spark.sql.expressions.Window

在第一步中,您可以根据值1或3过滤“c”列上的数据。您将获得类似于

的数据
dft.show()
+---+---+---+---+
| id|  a|  b|  c|
+---+---+---+---+
|  1|  7|  2|  1|
|  2| 15|  2|  3|
|  3| 11|  2|  3|
|  4|  3|  2|  1|
|  5|  8|  2|  3|
+---+---+---+---+

接下来,定义窗口

val w = Window.orderBy("id")

完成此操作后,创建一个新列并将之前的值放入其中

dft.withColumn("prev", lag("c",1).over(w)).show()
+---+---+---+---+----+
| id|  a|  b|  c|prev|
+---+---+---+---+----+
|  1|  7|  2|  1|null|
|  2| 15|  2|  3|   1|
|  3| 11|  2|  3|   3|
|  4|  3|  2|  1|   3|
|  5|  8|  2|  3|   1|
+---+---+---+---+----+

最后过滤“c”和“prev”列的值

注意:在编写最终代码时,请结合使用这些步骤,以便直接应用过滤器。