假设这是我的数据:
date value
2016-01-01 1
2016-01-02 NULL
2016-01-03 NULL
2016-01-04 2
2016-01-05 3
2016-01-06 NULL
2016-01-07 NULL
2016-01-08 NULL
2016-01-09 1
我正在尝试查找空值组周围的开始日期和结束日期。输出示例如下:
start end
2016-01-01 2016-01-04
2016-01-05 2016-01-09
我对这个问题的第一次尝试产生了以下结果:
df.filter($"value".isNull)\
.agg(to_date(date_add(max("date"), 1)) as "max",
to_date(date_sub(min("date"),1)) as "min"
)
但这只会找到最小和最大值的总和。我想使用groupBy,但不知道如何为每个空值块创建一列。
发布于 2018-06-10 03:18:40
我没有一个有效的解决方案,但我有一些建议。
Look at using a lag;您还必须对该代码稍作修改,以生成一个前导列。
现在假设您有您的滞后和领先列。生成的dataframe现在将如下所示:
date value lag_value lead_value
2016-01-01 1 NULL 1
2016-01-02 NULL NULL 1
2016-01-03 NULL 2 NULL
2016-01-04 2 3 NULL
2016-01-05 3 NULL 2
2016-01-06 NULL NULL 3
2016-01-07 NULL NULL NULL
2016-01-08 NULL 1 NULL
2016-01-09 1 1 NULL
现在,您要做的就是根据以下条件进行过滤:
min date:
df.filter("value IS NOT NULL AND lag_value IS NULL")
max date:
df.filter("value IS NULL AND lead_value IS NOT NULL")
如果您想更高级一点,还可以使用when
命令创建一个新列,声明日期是null组的开始日期还是结束日期:
date value lag_value lead_value group_date_type
2016-01-01 1 NULL 1 start
2016-01-02 NULL NULL 1 NULL
2016-01-03 NULL 2 NULL NULL
2016-01-04 2 3 NULL end
2016-01-05 3 NULL 2 start
2016-01-06 NULL NULL 3 NULL
2016-01-07 NULL NULL NULL NULL
2016-01-08 NULL 1 NULL NULL
2016-01-09 1 1 NULL end
可以使用如下所示的内容来创建此文件:
from pyspark.sql import functions as F
df_2.withColumn('group_date_type',
F.when("value IS NOT NULL AND lag_value IS NULL", start)\
.when("value IS NULL AND lead_value IS NOT NULL", end)\
.otherwise(None)
)
https://stackoverflow.com/questions/50777031
复制相似问题