Как сравнить разницу между двумя временными метками поля с определенным интервалом времени в Spark SQL? - PullRequest
0 голосов
/ 02 апреля 2020

Я довольно долго искал и не нашел решения для сравнения временного интервала с разницей между двумя полями отметок времени в простом 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

1 Ответ

0 голосов
/ 02 апреля 2020

Я решил это с помощью:

ИНТЕРВАЛ 30 МИНУТ вместо ИНТЕРВАЛ 30 минут в запросе.

...