Реализация функции отставания путем обновления той же колонки - PullRequest
0 голосов
/ 01 марта 2019

Мне нужно обновить значение задержки для штрих-кода (offset=1) до штрих-кода

case 
  when ( lag(barcode,1) over (order by barcode ) 
        and  Datediff(SS, eventdate,lag(next_eventdate,1) over (order by barcode)) < 3*3600 ) 
  THEN 1 
  ELSE 0 
END as FLAG 

Я реализовал его в pyspark, но выдает ошибку

from pyspark.sql.functions import col, unix_timestamp
timeDiff = unix_timestamp('eventdate', format="ss")- unix_timestamp(F.lag('next_eventdate', 1), format="ss")
ww= Window.orderBy("barcode") 
Tgt_df_tos = Tgt_df_7.withColumn('FLAG',F.when((F.lag('barcode', 1)) & ( timeDiff <= 10800),"1").otherwise('0'))   

Ошибка, которую я получаю

AnalysisException: "cannot resolve '(lag(`barcode`, 1, NULL) AND ((unix_timestamp(`eventdate`, 'ss') - unix_timestamp(lag(`next_eventdate`, 1, NULL), 'ss')) <= CAST(10800 AS BIGINT)))' due to data type mismatch: differing types in '(lag(`barcode`, 1, NULL) AND ((unix_timestamp(`eventdate`, 'ss') - unix_timestamp(lag(`next_eventdate`, 1, NULL), 'ss')) <= CAST(10800 AS BIGINT)))' (int and boolean).

1 Ответ

0 голосов
/ 01 марта 2019

Я не знаком с pyspark, но мне кажется, что проблема в выражении CASE.

CASE WHEN (
        LAG(barcode,1) OVER (ORDER BY barcode ) 
    AND
        DATEDIFF(SS, eventdate, LAG(next_eventdate, 1) OVER(ORDER BY barcode)) < 3*3600
)

Есть два выражения: "LAG (штрих-код, 1) OVER (ORDER BY barcode) ", который оценивается как INTEGER.

" DATEDIFF (SS, eventdate, LAG (next_eventdate, 1) OVER (ORDER BY barcode)) <3 * 3600 ", который оценивается как логическое значение (из-за неравенства). </p>

Эти выражения объединяются с оператором AND, обычно используемым для объединения двух логических выражений.Я считаю, что это является причиной ошибки.

LAG (штрих-код, 1) OVER (ORDER BY barcode) оценивается как INTEGER, а не как логическое значение.

Таким образом, выражение выглядит примерно так:

CASE WHEN (324857 AND True) THEN 1 ELSE 0 END as FLAG

AnalysisException: "cannot resolve .... (int and boolean).
...