#date #apache-spark #intervals
#Дата #apache-spark #интервалы
Вопрос:
Мой spark df состоит из столбцов — PersonId, DateofBirth
Если я выполнил следующие вычисления для определения возраста: — func.current_date() - df.DateOfBirth
На выходе получается интервал типа данных со значениями типа
- 45 лет 2 дня
- 67 лет 15 дней
Любые предложения, как я мог бы извлечь значение года из интервального типа данных?
Комментарии:
1. если все, что вам нужно, это количество лет, вы можете просто взять разницу в годах.
func.year(func.current_date())-func.year(df.DateOfBirth)
Ответ №1:
На данный момент Spark не может выполнять операции с типом интервала изначально. Он может создать тип интервала, но не выполнять с ним никаких дальнейших операций. См. Открытую проблему JIRA: issues.apache.org/jira/browse/SPARK-33054
С помощью Scala вы можете выполнить следующие действия, используя UDF:
import org.apache.spark.sql.{functions => F}
import spark.implicits._
import org.apache.spark.unsafe.types.CalendarInterval
val getPeriod = udf((x: CalendarInterval) => x.extractAsPeriod().getDays())
spark.udf.register("getPeriod", getPeriod)
val testDF = (spark.createDataFrame(List("1970-01-01", "1970-01-02").map(Tuple1(_)))
.toDF("DateofBirth")
.withColumn("DateofBirth", F.to_date(F.col("DateofBirth"))));
(testDF.withColumn("interval", F.to_date(F.lit("1970-01-10")) - F.col("DateofBirth"))
.withColumn("diff", getPeriod(F.col("interval")))
.collect());