Сброс счетчика на оконных функциях - PullRequest
1 голос
/ 24 апреля 2020

У меня есть набор данных, подобный приведенному ниже, и я хочу создать новый столбец C, который действует как номер счетчика / строки, который должен сбрасываться каждый раз, когда столбец B имеет 0, разделенный на значение столбца A

Использование Spark SQL / 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|
    +---+---+---+

1 Ответ

2 голосов
/ 24 апреля 2020

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
...