Scala:如何将整数转换为时间戳

时间:2018-02-05 14:57:22

标签: scala apache-spark

当我尝试使用' months_between'函数查找两个日期之间的月数时,我遇到了一个问题。当我的输入日期格式为' dd / mm / yyyy'或任何其他日期格式,然后该函数返回正确的输出。但是当我将输入日期格式作为yyyymmdd传递时,我得到以下错误。

代码:

val df = spark.read.option("header", "true").option("dateFormat", "yyyyMMdd").option("inferSchema", "true").csv("MyFile.csv")
 val filteredMemberDF = df.withColumn("monthsBetween", functions.months_between(col("toDate"), col("fromDT")))

错误:

  

无法解决' months_between(toDatefromDT)'由于数据类型不匹配:参数1需要时间戳类型,        然而,' toDate'属于int类型。参数2需要时间戳类型,然而,' fromDT'属于int类型。;

当我的输入如下时,

id   fromDT     toDate
11   16/06/2008  16/08/2008
12   13/07/2008  13/10/2008

获得预期的输出,

id   fromDT     toDate     monthsBetween
11   16/6/2008  16/8/2008      2
12   13/7/2008  13/10/2008     3

当我传递以下数据时,面对上述错误。

id   fromDT     toDate  
11   20150930  20150930  
12   20150930  20150930 

1 个答案:

答案 0 :(得分:0)

首先需要使用to_date函数将这些数字转换为DateTimes。

import org.apache.spark.sql.functions._

val df = spark.read
  .option("header", "true")
  .option("dateFormat", "yyyyMMdd")
  .option("inferSchema", "true")
  .csv("MyFile.csv")

val dfWithDates = df
  .withColumn("toDateReal", to_date(concat(col("toDate")), "yyyyMMdd"))
  .withColumn("fromDateReal", to_date(concat(col("fromDT")), "yyyyMMdd"))

val filteredMemberDF = dfWithDates
  .withColumn("monthsBetween", months_between(col("toDateReal"), col("fromDateReal")))