Группировать в текущую строку значения предыдущей группы с помощью Pyspark

Итак, у меня есть фреймворк pyspark, организованный следующим образом:

ID timestamp value1 value2
1 1 a x
2 1 a y
1 2 b x
2 2 b y
1 3 c y
2 3 d y
1 4 l y
2 4 s y

и предположим, что метка времени — это номер дня от начала времени. Я бы хотел для каждой строки сгруппировать в список значения до -x дней относительно текущего идентификатора, чтобы иметь:

ID timestamp value1 value2 list_value_1
1 1 a X a
2 1 a y a
1 2 b x a,b
2 2 b y a,b
1 3 c y a,b,c
2 3 d y a,b,d
1 3 c y b,c,l
2 3 d y b,d,s

Я полагаю, что должен сделать это с помощью Window, но я не уверен, что делать дальше (я по какой-то причине плохо разбираюсь в Windows).

См. также:  PyCall не может найти scipy в Юлии
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Tsadoq

    Вы можете сделать collect_list над Window между текущей строкой и двумя предыдущими строками и объединить список в строку, разделенную запятыми, используя concat_ws:

    from pyspark.sql import functions as F, Window
    
    df2 = df.withColumn(
        'list_value_1', 
        F.concat_ws(',', 
            F.collect_list('value1').over(
                Window.partitionBy('ID').orderBy('timestamp').rowsBetween(-2, 0)
            )
        )
    )
    
    df2.show()
    +---+---------+------+------+------------+
    | ID|timestamp|value1|value2|list_value_1|
    +---+---------+------+------+------------+
    |  1|        1|     a|     x|           a|
    |  1|        2|     b|     x|         a,b|
    |  1|        3|     c|     y|       a,b,c|
    |  1|        4|     l|     y|       b,c,l|
    |  2|        1|     a|     y|           a|
    |  2|        2|     b|     y|         a,b|
    |  2|        3|     d|     y|       a,b,d|
    |  2|        4|     s|     y|       b,d,s|
    +---+---------+------+------+------------+
    

    Большое спасибо, преобразование запятой не нужно, так как они мне нужны только в виде списка. Мне пришлось удалить обычное соглашение об использовании [el1, el2, …], потому что по какой-то причине возникли проблемы с переполнением стека в таблице person Tsadoq; 18.05.2021

    тогда вы можете удалить часть кода concat_ws person Tsadoq; 18.05.2021

    Да, сделал это, я только хотел добавить это для других возможных читателей :) person Tsadoq; 18.05.2021

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: