Sql 窗口功能上的重置计数器
我有一个如下所示的数据集,我想创建一个新的列C,它的作用类似于计数器/行号,每当列B的0被列a的值分区时,它都应该被重置 只有使用SparkSQL/SQL,我才能使用PysparkSql 窗口功能上的重置计数器,sql,pyspark,apache-spark-sql,Sql,Pyspark,Apache Spark Sql,我有一个如下所示的数据集,我想创建一个新的列C,它的作用类似于计数器/行号,每当列B的0被列a的值分区时,它都应该被重置 只有使用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]]) >>>
>>> 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
您需要一个列来指定数据的顺序。这将是列AWow。你能解释一下这个分组是如何工作的吗!你会成为第一个达到100万分的SO会员吗哇:@CPak。乔恩·斯基特多年前就获得了这个荣誉。@GordonLinoff谢谢你提供的信息祝你好运quest@Bala . . . 它正在对计数为0的行进行累积求和。它定义了要用于行号的分组。您可以运行子查询以查看中间结果。