Реализация оконных функций (lag, lead) в pyspark? - PullRequest
0 голосов
/ 21 февраля 2019

Ниже приведен код T-SQL.Я попытался преобразовать его в pyspark с помощью оконных функций, которые также прикреплены.

case 
           when eventaction = 'IN' and lead(eventaction,1) over (PARTITION BY barcode order by barcode,eventdate,transactionid) in('IN','OUT') 
                then                   lead(eventaction,1) over (PARTITION BY barcode order by barcode,eventdate,transactionid) 
           else ''
      end as next_action

Ошибка выдачи кода Pyspark с помощью функции оконной функции

Tgt_df = Tgt_df.withColumn((('Lead', lead('eventaction').over(Window.partitionBy("barcode").orderBy("barcode","transactionid", "eventdate")) == 'IN' )|
                    ('1', lead('eventaction').over(Window.partitionBy("barcode").orderBy("barcode","transactionid", "eventdate")) == 'OUT')
                     , (lead('eventaction').over(Window.partitionBy("barcode").orderBy("barcode","transactionid", "eventdate"))).otherwise('').alias("next_action")))

Но это не работает.Что делать!?

1 Ответ

0 голосов
/ 21 февраля 2019

Метод withColumn следует использовать как df.withColumn('name_of_col', value_of_column), поэтому у вас есть ошибка.

Из ваших запросов T-SQL соответствующий код pyspark должен быть:

import pyspark.sql.functions as F
from pyspark.sql.window import Window

w = Window.partitionBy("barcode").orderBy("barcode","transactionid", "eventdate")

Tgt_df = Tgt_df.withColumn('next_action',
                           F.when((F.col('event_action')=='IN')&(F.lead('event_action', 1).over(w).isin(['IN', 'OUT'])),
                                  F.lead('event_action', 1).over(w)
                                  ).otherwise('')
                           )
...