在 Spark Dataframe API 中将出生日期转换为年龄

Posted

技术标签:

【中文标题】在 Spark Dataframe API 中将出生日期转换为年龄【英文标题】:Convert Date of Birth into Age in Spark Dataframe API 【发布时间】:2015-09-09 15:48:49 【问题描述】:

这看起来很简单,但我找不到答案。我正在尝试将以下日期格式的出生日期列转换为 Spark Dataframe API 中的日期格式,然后计算相应的年龄。我可能还需要系统日期。我发现了一些可能有用的 java 库,但在将它与 dataframe api 一起使用时我仍然遇到一些困难。

23-AUG-67 66 年 2 月 28 日 09-APR-59

9/10/2015 编辑:我刚刚发现 Spark 1.5.0 添加了“日期时间功能”,这将在未来 1.5.0 发布时有所帮助here。不幸的是,它不适用于 AWS EMR 中的当前 spark 版本。

2015 年 9 月 10 日晚间编辑: 我能够使用以下代码将出生日期转换为年龄。请注意,getYear() 函数已被弃用,但我可以看出它们工作正常。

import java.sql.Date
import java.text.SimpleDateFormat
import org.apache.spark.sql.SQLContext

val sqlsc= new SQLContext(sc)

val epoch = System.currentTimeMillis
val curDate = new Date(epoch)
val dtFormat = new SimpleDateFormat("dd-MMM-yy")

val dobToAge = udf( (dob: String) => 
  val javaUtilDate = dtFormat.parse(dob)
  val sqlDate = new Date(javaUtilDate.getTime())
  curDate.getYear - sqlDate.getYear
)

inputdata.withColumn("AGE", dobToAge('dob))

【问题讨论】:

【参考方案1】:

与其使用已弃用的 java.util.Date getXXX 方法,不如使用 java.util.Calendar。

此外,您的解决方案并非在所有情况下都有效。如果某人出生于 1976 年 12 月 31 日。他的年龄将计算为 2015-1976 = 39,即使在 2015 年 1 月 1 日,他几乎不会满 39 岁。

您应该使用如下所示的计算:http://howtodoinjava.com/2014/05/26/java-code-to-calculate-age-from-date-of-birth/(将 Java 代码转换为 Scala 应该不是什么大问题)。

【讨论】:

【参考方案2】:

我能够使用带有 sql 日期格式的 udf 将出生日期列转换为年龄。详情请查看编辑。

【讨论】:

【参考方案3】:
LocalDate birthdate = new LocalDate (1970, 1, 20);
LocalDate now = new LocalDate();
Years age = Years.yearsBetween(birthdate, now);

【讨论】:

【参考方案4】:
select datediff(current_date(),
         TO_DATE(CAST(UNIX_TIMESTAMP(dateOfBirth,'yyyy-MM-dd') AS TIMESTAMP)))/365 as age
  from <TABLE_NAME>

【讨论】:

以上是关于在 Spark Dataframe API 中将出生日期转换为年龄的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spark Streaming 中将 RDD 转换为 DataFrame,而不仅仅是 Spark

如何在 Scala(Spark 2.0)中将带有字符串的 DataFrame 转换为带有 Vectors 的 DataFrame

在 Spark 中将 MS Access 表加载为 DataFrame

如何在 Spark 中将 JavaPairInputDStream 转换为 DataSet/DataFrame

在scala中将Spark Dataframe转换为RDD

如何在 pyspark 中将 DenseMatrix 转换为 spark DataFrame?