具有火花条件的滞后功能

时间:2019-06-14 05:52:54

标签: scala apache-spark

我正在使用spark我想计算在false之前出现的true列 这是我的桌子:

条件是

  

如果d_difference> 900,则认为是假,否则为真

id          date1               date2            d_difference    status    
534     18/03/15 11:50:30  18/03/15 11:50:45         15          true
534     18/03/15 11:50:50  18/03/15 11:50:59         09          true
534     18/03/15 12:00:30  18/03/15 12:35:45         1815        false
534     18/03/15 12:00:50  18/03/15 12:36:45         2165        false
534     18/03/15 12:37:30  18/03/15 12:37:45         15          true
534     18/03/15 12:38:00  18/03/15 12:38:10         10          true
534     18/03/15 12:42:30  18/03/15 12:50:45         495         true
534     18/03/15 12:50:50  18/03/15 01:15:45         1505        false
534     18/03/15 12:50:30  18/03/15 12:50:55         20          true


val v2 = v1.withColumn("status",when($"d_difference" > 900,false).otherwise(true))

v2.withcolumn("lag_data",when ($"staus" === false ,lag("status",1).over(w)).otherwise(null)).show()

我正在使用火花滞后功能来计算先前的真实条件,该条件之前为false,但失败了...

3 个答案:

答案 0 :(得分:0)

下面的解决方案只是我能想到的想法。我没有IDE来测试ant运行它。 只是尝试以帮助的方式就可以想到。

假设您的列状态为true和false。我们必须在第一个错误之前计算正确的数目。 我能想到的RDD的一种方法是。

获取rdd包含状态。让第rddOfStatus天。

rddOfStats.zipWithIndex().filter(condition).first
  1. zipWithIndex将索引每个状态,例如 “ true”,0 “真实”,1 “假”,2
  2. 对此进行过滤并获得第一个元素(tple)

“假”,2

  1. 从该元组中,我们可以提取值并获取计数。

或者可以使用Dataframe或Spark SQl完成相同的操作。

  1. 添加具有rownum的列以为每行分配数字,

  2. 然后将所有内容过滤为true,仅保留false

  3. 然后获得最小的行号

答案 1 :(得分:0)

  

我可以使用2个时间窗函数来计算所有假值

val w = Window.partitionBy("id").orderBy("date1","date2")
 val w1 = Window.partitionBy("id","status").orderBy("date1","date2")
 val r1 = ($"status" !== lag($"status", 1).over(w) && $"status").cast("bigint")
 v2.withColumn("new_session",r1)
 val t1 = v2.withColumn("session",sum(r1).over(w1)).show()
  

我得到的假数值总数在true之前。

答案 2 :(得分:0)

  

如果您想在True之前累积False,则可以参考   下面的代码:

    scala> import org.apache.spark.sql.expressions.Window
    scala> val w = Window.partitionBy("id").orderBy("id")
    scala> val w1 = Window.partitionBy("id").orderBy("rn")

 //Input data frame
    scala> df.show()
    +---+-----------------+-----------------+------------+------+
    | id|            date1|            date2|d_difference|status|
    +---+-----------------+-----------------+------------+------+
    |534|18/03/15 11:50:30|18/03/15 11:50:45|          15|  true|
    |534|18/03/15 11:50:50|18/03/15 11:50:59|          09| false|
    |534|18/03/15 12:00:30|18/03/15 12:35:45|        1815| false|
    |534|18/03/15 12:00:50|18/03/15 12:36:45|        2165| false|
    |534|18/03/15 12:37:30|18/03/15 12:37:45|          15|  true|
    |534|18/03/15 12:38:00|18/03/15 12:38:10|          10| false|
    |534|18/03/15 12:42:30|18/03/15 12:50:45|         495|  true|
    |534|18/03/15 12:50:50|18/03/15 01:15:45|        1505| false|
    |534|18/03/15 12:50:30|18/03/15 12:50:55|          20|  true|
    +---+-----------------+-----------------+------------+------+

    scala> val df1 = df.withColumn("rn", row_number over(w))
    scala> val df2 = df1.filter(col("status") === "false").withColumn("prv_rn",  lag("rn" ,1,0) over (w))

    scala> val df3 = df2.withColumn("sum", (col("rn") - col("prv_rn") - 1)).withColumn("true_count", sum(col("sum")) over(w1)).select("id","date1","date2","status","true_count")

  //Join final output
    scala> df.join(df3, Seq("id","date1","date2","status"),"left").show()
    +---+-----------------+-----------------+------+------------+----------+
    | id|            date1|            date2|status|d_difference|true_count|
    +---+-----------------+-----------------+------+------------+----------+
    |534|18/03/15 11:50:30|18/03/15 11:50:45|  true|          15|      null|
    |534|18/03/15 11:50:50|18/03/15 11:50:59| false|          09|         1|
    |534|18/03/15 12:00:30|18/03/15 12:35:45| false|        1815|         1|
    |534|18/03/15 12:00:50|18/03/15 12:36:45| false|        2165|         1|
    |534|18/03/15 12:37:30|18/03/15 12:37:45|  true|          15|      null|
    |534|18/03/15 12:38:00|18/03/15 12:38:10| false|          10|         2|
    |534|18/03/15 12:42:30|18/03/15 12:50:45|  true|         495|      null|
    |534|18/03/15 12:50:50|18/03/15 01:15:45| false|        1505|         4|
    |534|18/03/15 12:50:30|18/03/15 12:50:55|  true|          20|      null|
    +---+-----------------+-----------------+------+------------+----------+