我在Scala中有两个数据帧:
df1 =
ID Field1
1 AAA
2 BBB
4 CCC
和
df2 =
PK start_date_time
1 2016-10-11 11:55:23
2 2016-10-12 12:25:00
3 2016-10-12 16:20:00
我还有一个变量start_date
,其格式yyyy-MM-dd
等于2016-10-11
。
我需要根据以下条件在check
中创建新列df1
:If PK is equal to ID AND the year, month and day of start_date_time are equal to start_date, then check is equal to 1, otherwise 0
。
结果应该是这个:
df1 =
ID Field1 check
1 AAA 1
2 BBB 0
4 CCC 0
在my previous question我有两个数据帧,建议使用加入和过滤。但是,在这种情况下,它将无法正常工作。我最初的想法是使用udf
,但不知道如何让它适用于这种情况。
答案 0 :(得分:1)
您可以针对此案例合并withColumn
和df2
。即首先在ID列上加入when.otherwise
,然后使用import org.apache.spark.sql.functions.lit
val df2_date = df2.withColumn("date", to_date(df2("start_date_time"))).withColumn("check", lit(1)).select($"PK".as("ID"), $"date", $"check")
df1.join(df2_date, Seq("ID"), "left").withColumn("check", when($"date" === "2016-10-11", $"check").otherwise(0)).drop("date").show
+---+------+-----+
| ID|Field1|check|
+---+------+-----+
| 1| AAA| 1|
| 2| BBB| 0|
| 4| CCC| 0|
+---+------+-----+
语法修改检查列:
df2
或其他选项,首先在df1
上过滤,然后将其与ID
列上的val df2_date = (df2.withColumn("date", to_date(df2("start_date_time"))).
filter($"date" === "2016-10-11").
withColumn("check", lit(1)).
select($"PK".as("ID"), $"date", $"check"))
df1.join(df2_date, Seq("ID"), "left").drop("date").na.fill(0).show
+---+------+-----+
| ID|Field1|check|
+---+------+-----+
| 1| AAA| 1|
| 2| BBB| 0|
| 4| CCC| 0|
+---+------+-----+
一起加入:
2016-OCT-11
如果您有val format = new java.text.SimpleDateFormat("yyyy-MMM-dd")
val parsed = format.parse("2016-OCT-11")
val date = new java.sql.Date(parsed.getTime())
// date: java.sql.Date = 2016-10-11
之类的日期,可以将其转换为sql Date进行比较,如下所示:
{{1}}