重置窗口功能的计数器

我有一个像下面这样的数据集,我想创建一个新的列C,它就像一个反行数,每当列B的列值为0时,这个反行数就应该被重置。

只使用SparkSQL的SQL(我可以使用Pyspark来做)。

>>> rdd = sc.parallelize([
...     [1, 0], [1, 1],[1, 1], [1, 0], [1, 1],
...     [1, 1], [2, 1], [2, 1], [3, 0], [3, 1], [3, 1], [3, 1]])
>>> df = rdd.toDF(['A', 'B'])
>>> 
>>> df.show()
+---+---+
|  A|  B|
+---+---+
|  1|  0|
|  1|  1|
|  1|  1|
|  1|  0|
|  1|  1|
|  1|  1|
|  2|  1|
|  2|  1|
|  3|  0|
|  3|  1|
|  3|  1|
|  3|  1|
+---+---+

我想实现的目标

+---+---+---+
|  A|  B|  C|
+---+---+---+
|  1|  0|  1|
|  1|  1|  2|
|  1|  1|  3|
|  1|  0|  1|
|  1|  1|  2|
|  1|  1|  3|
|  2|  1|  1|
|  2|  1|  2|
|  3|  0|  1|
|  3|  1|  2|
|  3|  1|  3|
|  3|  1|  4|
+---+---+---+

到目前为止,我有什么

>>> spark.sql('''
...    select *, row_number() over(partition by A order by A) as C from df
...    ''').show()

    +---+---+---+
    |  A|  B|  C|
    +---+---+---+
    |  1|  0|  1|
    |  1|  1|  2|
    |  1|  1|  3|
    |  1|  0|  4|
    |  1|  1|  5|
    |  1|  1|  6|
    |  3|  0|  1|
    |  3|  1|  2|
    |  3|  1|  3|
    |  3|  1|  4|
    |  2|  1|  1|
    |  2|  1|  2|
    +---+---+---+

解决方案:

SQL表表示 无序 集。 你需要一个列来指定数据的排序。

有了这样的一列,你就可以积累 0 值,因为它们看起来是断点。 所以:

select df.*, row_number() over (partition by A, grp order by A) as C
from (select df.*,
             sum(case when b = 0 then 1 else 0 end) over (partition by A order by <ordering column>) as grp
      from df
      ) df

给TA打赏
共{{data.count}}人
人已打赏
未分类

将网站的url分割成多列到scala数据框架中。

2022-9-9 6:58:19

未分类

我在Flutter中访问一个数组值有问题

2022-9-9 6:58:21

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索