Я довольно долго искал и не нашел решения для сравнения временного интервала с разницей между двумя полями отметок времени в простом Spark SQL в качестве запроса.
Ниже приведен собственный PostgreSQL код, который работает как шарм:
case
when t1.prev_time <> t1.prev_time_calc and t1."Timestamp" - t1.prev_time < interval '30 min'
then t1.next_time_calc - t1.prev_time_calc
when (t1.next_time <> t1.next_time_calc and t1.next_time - t1."Timestamp" < interval '30 min') or (t1.next_time - t1."Timestamp" < interval '30 min')
then t1.next_time_calc - t1."Timestamp"
else null
end min_diff
Ниже приведена ошибка, которую я получаю в Spark, если я запускаю как:
py4j.protocol.Py4JJavaError: An error occurred while calling o59.sql.
: org.apache.spark.sql.catalyst.parser.ParseException:
No interval can be constructed(line 6, pos 99)
== SQL ==
select
t1.a, t1.b, t1.c, t1.next_time_calc, t1.next_time,
case
when t1.prev_time <> t1.prev_time_calc and ((t1.Timestamp - t1.prev_time) < INTERVAL '30 min')
---------------------------------------------------------------------------------------------------^^^
then t1.next_time_calc - t1.prev_time_calc
when (t1.next_time <> t1.next_time_calc and t1.next_time - t1.Timestamp < INTERVAL '30 min') or ((t1.next_time - t1.Timestamp) < INTERVAL '30 min')
then t1.next_time_calc - t1.Timestamp
else null
end min_diff
Как видите, я удалил кавычки, я удалил ключевое слово интервал и так далее и тому подобное, чтобы попробовать, но не работает, как это сделать?
My Spark SQL код:
oper_n_qc_working_hrs_df2 = spark.sql("""select
t1.a, t1.b, t1.c, t1.next_time_calc, t1.next_time,
case
when t1.prev_time <> t1.prev_time_calc and ((t1.Timestamp - t1.prev_time) < INTERVAL '30 min')
then t1.next_time_calc - t1.prev_time_calc
when (t1.next_time <> t1.next_time_calc and t1.next_time - t1.Timestamp < INTERVAL '30 min') or ((t1.next_time - t1.Timestamp) < INTERVAL '30 min')
then t1.next_time_calc - t1.Timestamp
else null
end min_diff
from oper_n_qc_working_hrs_df1 t1""")
Версии: Spark: 2,4 Python: 3,7