我的数据框看起来像
id |reg_date | txn_date|
+----------+----------+--------------------+
|1 |2019-01-06| 2019-02-15 12:51:15|
|1 |2019-01-06| 2019-03-29 13:15:27|
|1 |2019-01-06| 2019-06-01 01:42:57|
|1 |2019-01-06| 2019-01-06 17:01:...|
|5 |2019-06-16| 2019-07-19 11:50:34|
|5 |2019-06-16| 2019-07-13 19:49:39|
|5 |2019-06-16| 2019-08-27 17:37:22|
|2 |2018-07-30| 2019-01-01 07:03:...|
|2 |2018-07-30| 2019-07-30 01:27:57|
|2 |2018-07-30| 2019-02-01 00:08:35
我想在reg_date
之后拾取第一个txn_date
,即reg_date >= txn_date
的第一个txn_date
。
预期输出
id |reg_date | txn_date|
+----------+----------+--------------------+
|1 |2019-01-06| 2019-01-06 17:01:...|
|5 |2019-06-16| 2019-07-13 19:49:39|
|2 |2018-07-30| 2019-07-30 01:27:57|
我做的一切,
df = df.withColumn('txn_date',to_date(unix_timestamp(F.col('txn_date'),'yyyy-MM-dd HH:mm:ss').cast("timestamp")))
df = df.withColumn('reg_date',to_date(unix_timestamp(F.col('reg_date'),'yyyy-MM-dd').cast("timestamp")))
gg = df.groupBy('id','reg_date').agg(min(F.col('txn_date')))
但是得到错误的结果。
2条答案
按热度按时间83qze16e1#
条件
reg_date >= txn_date
可能是不明确的。2019-01-06>=2019-01-06 17:01:30
是指2019-01-06 00:00:00>=2019-01-06 17:01:30
还是2019-01-06 23:59:59>=2019-01-06 17:01:30
?在你的例子中,
2019-01-06>=2019-01-06 17:01:30
被评估为true,所以我假设它是后一种情况,即。时间23:59:59根据上面的假设,下面是我如何编码的。
jaql4c8m2#
你不需要点餐。您可以使用过滤器丢弃所有较小的值,然后按id聚合并获得较小的时间戳,因为第一个时间戳将是最小值。例如: