sql - 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
)
我正在尝试查找是否有其他优化方式?
解决方案
您的方法很好,但可以更简洁地写成:
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
还要注意,如果是唯一的,则不需要窗口子句。
推荐阅读
- java - 在“最近的文件”中获取带有两个点文件名的文件
- angular - 如果数据已更改,则不会刷新数据网格中的激活过滤器
- azure - 使用 ARM 完全自动化 Microsoft bot 框架部署(应用程序设置被删除并且功能缺失)
- typo3 - 错字3 fe 登录不起作用
- python - 在 Python 中将 dict 转换为另一个结构
- mysql - MySQL 5.7 JSON 列更新
- c++ - 在基类中定义枚举时,qml 中的 Q_ENUM 未定义值
- java - 发送电子邮件后的测试报告状态滑动
- c# - 比较通用的 Nullable 类型
- x86 - x86-64 CPU 寄存器是否在多个内核之间共享?