Расчет PySpark еженедельных вхождений

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

m = sc.parallelize(["oded,12-12-2018", "oded,12-03-2018", "oded,12-12-2018", "oded,12-06-2018", "oded2,12-02-2018", "oded2,12-02-2018"])
        m = m.map(lambda line: line.split(','))
        weekly = m.map(lambda line: (line[0], (parse(line[1]).strftime("%V%y"))))
        s = sql.createDataFrame(daily)
        s.groupby("_1", "_2").count().sort("_2")

результат:

+-----+----+-----+
|   _1|  _2|count|
+-----+----+-----+
|oded2|4818|    2|
| oded|4918|    2|
| oded|5018|    2|
+-----+----+-----+

Как я могу пойти и получить oded: 0 = ( 2 - 2 ) и oded2: 2 = (2 - 0)


person Himberjack    schedule 04.06.2017    source источник


Ответы (1)


Привет, вы можете использовать функцию окна задержки, чтобы найти значение за предыдущую неделю, после того, как вы посчитаете слова одноранговой недели. Для недель, у которых нет предыдущего значения, значение count будет равно нулю, или вы можете использовать na.drop(), чтобы полностью удалить эти строки.

from pyspark.sql.functions import lag, col,coalesce
from pyspark.sql.window import Window
w = Window().partitionBy("_1").orderBy(col("_2"))
s.select("*", lag("count").over(w).alias("prev_week")).na.fill(0).show()
person zlidime    schedule 04.06.2017
comment
Идеальный! Благодарю вас! - person Himberjack; 04.06.2017