我在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
==PK
且start_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"
}
但是,我对如何比较日期有疑问,因为df1
和df2
具有不同格式的日期。如何更好地实现它?
答案 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 functions在df1
和df2
上创建日期列,然后在df1, df2
上执行左连接,在此处创建一个额外的常量列{{ 1)}在df2上指示结果中是否匹配:
check