首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Spark在一系列值中查找空值块

Spark在一系列值中查找空值块
EN

Stack Overflow用户
提问于 2018-06-10 01:52:36
回答 1查看 58关注 0票数 1

假设这是我的数据:

代码语言:javascript
复制
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

我正在尝试查找空值组周围的开始日期和结束日期。输出示例如下:

代码语言:javascript
复制
start        end
2016-01-01   2016-01-04
2016-01-05   2016-01-09

我对这个问题的第一次尝试产生了以下结果:

代码语言:javascript
复制
df.filter($"value".isNull)\
    .agg(to_date(date_add(max("date"), 1)) as "max", 
         to_date(date_sub(min("date"),1)) as "min"
        )

但这只会找到最小和最大值的总和。我想使用groupBy,但不知道如何为每个空值块创建一列。

EN

回答 1

Stack Overflow用户

发布于 2018-06-10 03:18:40

我没有一个有效的解决方案,但我有一些建议。

Look at using a lag;您还必须对该代码稍作修改,以生成一个前导列。

现在假设您有您的滞后和领先列。生成的dataframe现在将如下所示:

代码语言:javascript
复制
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

现在,您要做的就是根据以下条件进行过滤:

代码语言:javascript
复制
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组的开始日期还是结束日期:

代码语言:javascript
复制
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 

可以使用如下所示的内容来创建此文件:

代码语言:javascript
复制
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)
                 )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50777031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档