首页 > 解决方案 > sparksql 获取列中的前一个非空值

问题描述

我试图仅在 spark SQL 中不为空时才获取列的前一行值。由于忽略空值不可用,因此替代方案将是排名并获得最大值。

lag( val ignore nulls) over ()

SELECT id, val, val_partition, MAX(val) over (partition by val_partition)
FROM (
        SELECT
            id,
            val,
            sum(case when val is null then 0 else 1 end) over (order by id rows unbounded preceding) as val_partition
          FROM base
     )

我正在尝试查找是否有其他优化方式?

标签: sqlapache-spark-sql

解决方案


您的方法很好,但可以更简洁地写成:

SELECT id, val, val_partition,
       MAX(val) over (PARTITION BY grp)
FROM (SELECT b.*,
             COUNT(val) over (ORDER BY id) as grp
      FROM base b
     ) b;

id还要注意,如果是唯一的,则不需要窗口子句。


推荐阅读