Я пытаюсь преобразовать свой прикрепленный код T-sql в скрипт Pyspark
CASE
WHEN min(t.timestamp_start) >= dateadd(hour, (8 - 2), t.date) AND min(t.timestamp_start) < dateadd(hour, (20 - 2), t.date) THEN 'Day'
WHEN min(t.timestamp_start) >= dateadd(hour, (18 - 2), t.date) OR min(t.timestamp_start) < dateadd(hour, (8 - 2 + 24), t.date) THEN 'Night'
WHEN max(t.timestamp_end) >= dateadd(hour, (8 + 4), t.date) AND max(t.timestamp_end) < dateadd(hour, (20 + 4), t.date) THEN 'Day'
WHEN max(t.timestamp_end) >= dateadd(hour, 24, t.date) OR max(t.timestamp_end) < dateadd(hour, (12 + 24), t.date) THEN 'Night'
ELSE NULL
END AS shifttype
FROM Demo_Dev.t
WHERE t.date > '2016-11-15'
GROUP BY t."individual id", t.date;
Обычно я использую .groupby (). Agg (max / min /), чтобы получить min и max и сохранить их в кадре данных. Например,
Tgt_df_tos_a = Tgt_df_tos_f.groupBy(col('barcode'), col('eventdate')).agg(F.max("next_eventdate"))
Но использование вышеуказанного метода было бы утомительно. Как я могу сделать это более эффективно. Заранее спасибо!
Это то, что я реализовал в Pyspark
Tgt_df_time_on_site_open_union.withColumn("shifttype", F.when( (F.min(F.col("timestamp_start")) >= unix_timestamp('date') + 6*60*60) & (F.min(F.col("timestamp_start")) < unix_timestamp('date') + 18*60*60) , 'Day' )
.when( (F.min(F.col("timestamp_start")) >= unix_timestamp('date') + 16*60*60) | (F.min(F.col("timestamp_start")) < unix_timestamp('date') + 30*60*60) , 'Night' )
.when( (F.max(F.col("timestamp_start")) >= unix_timestamp('date') + 12*60*60) & (F.max(F.col("timestamp_start")) < unix_timestamp('date') + 24*60*60) , 'Day' )
.when( (F.max(F.col("timestamp_start")) >= unix_timestamp('date') + 24*60*60) | (F.max(F.col("timestamp_start")) < unix_timestamp('date') + 36*60*60) , 'Night' ).otherwise("NULL"))