我正在使用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,但失败了...
答案 0 :(得分:0)
下面的解决方案只是我能想到的想法。我没有IDE来测试ant运行它。 只是尝试以帮助的方式就可以想到。
假设您的列状态为true和false。我们必须在第一个错误之前计算正确的数目。 我能想到的RDD的一种方法是。
获取rdd包含状态。让第rddOfStatus天。
rddOfStats.zipWithIndex().filter(condition).first
“假”,2
或者可以使用Dataframe或Spark SQl完成相同的操作。
添加具有rownum的列以为每行分配数字,
然后将所有内容过滤为true,仅保留false
然后获得最小的行号
答案 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|
+---+-----------------+-----------------+------+------------+----------+