Преобразовать столбец длинного типа в тип календаря в Spark SQL - PullRequest
1 голос
/ 03 апреля 2020

Два запроса:

Как преобразовать столбец длинного типа с числами в секундах в тип календаря с интервалом в Python Spark SQL?

Как преобразовать приведенный ниже код в обычный Spark SQL query:

from pyspark.sql.functions import unix_timestamp
df2 = df.withColumn(
    "difference_duration",
    unix_timestamp("CAL_COMPLETION_TIME") - unix_timestamp("Prev_Time")
    )

Пример кадра данных SS: enter image description here

В основном я пытаюсь выполнить этот запрос ниже PG SQL в Spark SQL :

case 
    when t1.prev_time <> t1.prev_time_calc and t1."CAL_COMPLETION_TIME" - 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."CAL_COMPLETION_TIME" < interval '30 min') or (t1.next_time - t1."CAL_COMPLETION_TIME" < interval '30 min')
      then t1.next_time_calc - t1."CAL_COMPLETION_TIME"
  else null
  end min_diff

Но эта часть t1. "CAL_COMPLETION_TIME" - t1.prev_time <интервал '30 мин '</em> выдает следующую ошибку:

AnalysisException: "cannot resolve '(t1.`CAL_COMPLETION_TIME` - t1.`prev_time`)' due to data type mismatch: '(t1.`CAL_COMPLETION_TIME` - t1.`prev_time`)' requires (numeric or calendarinterval) type, not timestamp;

1 Ответ

1 голос
/ 03 апреля 2020

Вы не можете вычесть метки времени, вам нужно привести их к секундам. Поэтому вам нужно привести столбцы метки времени к long / bigint , как есть. вычитая, divide by 60, чтобы получить минутное значение , а затем посмотреть, является ли оно less than 30.

#example=df1
#both columns are of type Timestamp
+-------------------+-------------------+
|          prev_time|CAL_COMPLETION_TIME|
+-------------------+-------------------+
|2019-04-26 01:19:10|2019-04-26 01:19:35|
+-------------------+-------------------+

Pyspark:

df1.withColumn("sub", F.when(((F.col("CAL_COMPLETION_TIME").cast("long")-F.col("prev_time").cast("long"))/60 < 30), F.lit("LESSTHAN30")).otherwise(F.lit("GREATERTHAN"))).show()

+-------------------+-------------------+----------+
|          prev_time|CAL_COMPLETION_TIME|       sub|
+-------------------+-------------------+----------+
|2019-04-26 01:19:10|2019-04-26 01:19:35|LESSTHAN30|
+-------------------+-------------------+----------+

Искра. sql

df1.createOrReplaceTempView("df1")
spark.sql("select prev_time, CAL_COMPLETION_TIME, IF(((CAST(CAL_COMPLETION_TIME as bigint) - CAST(prev_time as bigint))/60)<30,'LESSTHAN30','GREATER') as difference_duration from df1").show()

+-------------------+-------------------+-------------------+
|          prev_time|CAL_COMPLETION_TIME|difference_duration|
+-------------------+-------------------+-------------------+
|2019-04-26 01:19:10|2019-04-26 01:19:35|         LESSTHAN30|
+-------------------+-------------------+-------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...