我正在使用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
函数来解决这个问题,但我想有一种更好的方法可以使用to_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中将String转换为日期时间?
若不清楚,问题是如何有效地按小时范围过滤字符串日期?
您需要"正常的";timestamp,而不是unix_timestamp。
这样的东西应该有效,尽管我对确切的咒语有些生疏:
df
.withColumn(
"hour",
hour(to_timestamp($"foo", "MM/dd/yyy hh:mm:ss a"))
).filter($"hour" between (19,20))