Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 窗口功能上的重置计数器_Sql_Pyspark_Apache Spark Sql - Fatal编程技术网

Sql 窗口功能上的重置计数器

Sql 窗口功能上的重置计数器,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]]) >>>

我有一个如下所示的数据集,我想创建一个新的列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]])
>>> 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的行进行累积求和。它定义了要用于行号的分组。您可以运行子查询以查看中间结果。