首页 > 解决方案 > Scala:按小时范围过滤字符串日期?

问题描述

我正在使用 Scala 并尝试使用日期和时间值过滤字符串列上的数据集。我一直在看几个帖子并尝试使用SimpleDateFormat技术无济于事。

我的样本数据是:

+----------------------+
|my_date_str           |
+----------------------+
|12/11/2018 08:01:55 AM|
|12/11/2018 08:33:22 PM|
|12/13/2018 09:25:28 PM|
|12/17/2018 07:27:36 PM|
+----------------------+

我想在晚上 7 点到 9 点之间保留行(日期无关紧要,只有时间)。我希望保留四行中的这两行:

12/17/2018 07:27:36 PM
12/11/2018 08:33:22 PM

我可以使用substring函数一起破解它,但我想有更好的方法使用 ato_date unix函数(我尝试转换为秒,unix_timestamp()然后以某种方式推断时间?),隔离时间并检查小时值。

// Filter down to rows between 7 and 9 and PM
my_data.withColumn("hour_str", substring($"my_date_str", 12, 8))
    .filter( (substring($"my_date_str", -2, 2) === "PM") && ($"my_date_str" >= "07:00:00") && ($"my_date_str" <= "09:00:00") )
    .show(truncate=false)

包含太多失败的尝试,但这些是我使用的几个帖子:
如何在 Spark 中将 unix 时间戳转换为日期
如何在 Scala 中将字符串转换为日期时间?

如果不清楚,问题是如何按小时范围有效地过滤字符串日期?

标签: scala

解决方案


您需要“正常”时间戳,而不是 unix_timestamp。

像这样的东西应该可以工作,尽管我对确切的咒语有些生疏:

df
.withColumn(
  "hour", 
  hour(to_timestamp($"foo", "MM/dd/yyy hh:mm:ss a"))
).filter($"hour" between (19,20))

推荐阅读