比较数据框列中存在的scala中的日期

时间:2018-11-28 12:03:31

标签: scala apache-spark apache-spark-sql

我正尝试在过滤器中比较以下日期:-

数据帧KIN_PRC_FILE的列pos_price_expiration_dt的值为9999-12-31

val formatter = new SimpleDateFormat("yyyy-MM-dd");
val CURRENT_DATE = formatter.format(Calendar.getInstance().getTime());

val FILT_KMART_KIN_DATA= KIN_PRC_FILE.filter(s"(pos_price_expiration_dt)>=$CURRENT_DATE AND pos_price_type_cd").show(10)

但是上面的查询似乎返回空记录,有人可以帮助我了解这里的错误吗。

2 个答案:

答案 0 :(得分:1)

您只需要在current_date变量中添加单个逗号

KIN_PRC_FILE.filter(s"pos_price_expiration_dt >= '$CURRENT_DATE'")

此处的简单示例

输入

df.show
+-----------------------+---+
|pos_price_expiration_dt| id|
+-----------------------+---+
|             2018-11-20|  a|
|             2018-12-28|  b|
|                   null|  c|
+-----------------------+---+

输出

df.filter(s"pos_price_expiration_dt>='$CURRENT_DATE'").show

+-----------------------+---+
|pos_price_expiration_dt| id|
+-----------------------+---+
|             2018-12-28|  b|
+-----------------------+---+

答案 1 :(得分:0)

请注意,您正在使用具有日期值的字符串比较。由于您是以降序排列的格式(即yyyy-MM-dd),因此可以正常使用,但并不总是安全的。

在进行此类比较之前,您应该考虑将列强制转换为“日期”格式。 对于当前日期,您始终可以使用内置变量。检查一下:

scala> val KIN_PRC_FILE = Seq(("2018-11-01"),("2018-11-15"),("2018-11-30"),("2018-11-28"),(null)).toDF("pos_price_expiration_dt").withColumn("pos_price_expiration_dt",'pos_price_expiration_dt.cast("date"))
KIN_PRC_FILE: org.apache.spark.sql.DataFrame = [pos_price_expiration_dt: date]

scala> KIN_PRC_FILE.printSchema
root
 |-- pos_price_expiration_dt: date (nullable = true)


scala> KIN_PRC_FILE.show
+-----------------------+
|pos_price_expiration_dt|
+-----------------------+
|             2018-11-01|
|             2018-11-15|
|             2018-11-30|
|             2018-11-28|
|                   null|
+-----------------------+


scala> KIN_PRC_FILE.filter(s"pos_price_expiration_dt >= current_date ").show
+-----------------------+
|pos_price_expiration_dt|
+-----------------------+
|             2018-11-30|
|             2018-11-28|
+-----------------------+


scala>