根据日期检查创建新列

时间:2017-01-17 17:35:00

标签: scala apache-spark dataframe

我在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中创建新列df1If 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,但不知道如何让它适用于这种情况。

1 个答案:

答案 0 :(得分:1)

您可以针对此案例合并withColumndf2。即首先在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}}