【问题标题】:Create a new column based on date checking根据日期检查创建新列
【发布时间】:2017-01-18 02:34:17
【问题描述】:

我在 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

我需要根据以下条件在df1 中创建一个新列checkIf 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,但不确定如何使它适用于这种情况。

【问题讨论】:

  • 指定您使用的是 spark。据我所知,Scala 中没有默认数据框。

标签: scala apache-spark dataframe


【解决方案1】:

对于这种情况,您可以结合使用 joinwithColumn。即先在ID列上加入df2,然后使用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这样的日期,您可以将其转换为sql Date进行比较,如下所示:

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

【讨论】:

  • to_date 是否自动将start_date_time 中的值转换为yyyy-MM-dd?如果我在start_date 中有yyyy-MMM-dd 怎么办?那么start_date_time 将如何与start_date 进行比较?
  • 在这种情况下,您应该可以直接使用start_date_time 而无需使用to_date 进行转换。
  • 我的意思是,假设start_date_time 等于2016-10-11 11:55:23,它应该与等于2016-OCT-11 (yyyy-MMM-dd) 的start_date 进行比较。那么,start_date_time 的格式在哪里定义呢?
  • 我无法编译符号$。我应该导入哪个库?我正在使用 Spark 1.6.2。
  • import sqlContext.implicits._ 解决了这个问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 2022-11-12
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 2021-02-15
  • 2019-05-30
相关资源
最近更新 更多