Тип данных интервала вычисления возраста искры

#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());