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



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

23 - 8月- 67
28日- 2月- 66
09-APR-59

9/10/2015 Edit:我刚刚发现Spark 1.5.0增加了"日期时间函数",这将在未来1.5.0发布时有所帮助。不幸的是,它不能与AWS EMR中的当前spark版本一起使用。

9/10/2015晚报编辑:我可以使用下面的代码将出生日期转换为年龄。
注意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))

不使用java.util的过时的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应该不是什么大问题)。

我能够使用带有sql date格式的udf将出生日期列转换为年龄。

LocalDate birthdate = new LocalDate (1970, 1, 20);
LocalDate now = new LocalDate();
Years age = Years.yearsBetween(birthdate, now);
select datediff(current_date(),
         TO_DATE(CAST(UNIX_TIMESTAMP(dateOfBirth,'yyyy-MM-dd') AS TIMESTAMP)))/365 as age
  from <TABLE_NAME>

相关内容

  • 没有找到相关文章

最新更新