比较数据框中的日期

时间:2017-01-17 16:14:40

标签: scala dataframe

我在Scala中有两个数据帧:

df1 =

ID  start_date_time
1   2016-10-12 11:55:23
2   2016-10-12 12:25:00
3   2016-10-12 16:20:00

df2 =

PK  start_date
1   2016-10-12
2   2016-10-14

如果以下条件失败,我需要向df1添加一个值为0的新列,否则 - > 1

  

如果ID == PKstart_date_time将同一年,月和日称为start_date

结果应该是这个:

df1 =

ID  start_date_time      check
1   2016-10-12-11-55-23  1
2   2016-10-12-12-25-00  0
3   2016-10-12-16-20-00  0

我该怎么做?

我认为逻辑应该是这样的:

    df1 = df.withColumn("check", define(df("ID"),df("start_date")))

    val define = udf {(id: String,dateString:String) =>
       val formatter = new SimpleDateFormat("yyyy-MM-dd")
       val date = formatter.format(dateString)
       val checks = df2.filter(df2("PK")===ID).filter(df2("start_date_time")===date)
       if(checks.collect().length>0) "1" else "0"
    }

但是,我对如何比较日期有疑问,因为df1df2具有不同格式的日期。如何更好地实现它?

2 个答案:

答案 0 :(得分:1)

我没有确切的逻辑,我会做那样的事情:

val df3 = df2.
join(df1,df1("ID") === df2("ID")).
filter( ($"start_date_time").isBefore($"start_date") )

您需要使用以下代码将2时间戳转换为joda时间:Converting a date string to a DateTime object using Joda Time library

祝你好运!

答案 1 :(得分:1)

您可以使用spark datetime functionsdf1df2上创建日期列,然后在df1, df2上执行左连接,在此处创建一个额外的常量列{{ 1)}在df2上指示结果中是否匹配:

check