首页 > 解决方案 > 使用 Spark SQL 根据条件创建新列?

问题描述

我想添加一个新列,该列将显示一个名为“完成”的标签

该表如下所示:

no    type 
1      a
1      a
1      a
2      a
2      a
2      a 
2      a

并且“完成”标签将在新列中:

no    type    tag
1      a
1      a
1      a      done
2      a
2      a
2      a 
2      a      done

所以基本上,“完成”标签将出现在每个数字的末尾。

如何使用 Spark SQL 做到这一点?

谢谢你。

标签: sqlapache-spark-sql

解决方案


SQL 表表示无序集(技术上是多集,因为它们可以有重复)。没有指定排序的列就没有排序。没有“最后”行,因为没有排序。

通常,这样的排序可用作 id 或插入时间戳或其他东西。如果您有这样的列,则可以枚举每个行no,然后添加标签:

select t.*,
       (case when row_number() over (partition by type, no order by <ordering col> desc) = 1
             then 'done'
        end) as flag
from t;

注意:这保证了恰好一行带有no/type已经“完成”。即使行是交错的(基于排序列)也是如此。如果您只想检查下一行是否不同,则可以lead()改用。


推荐阅读