我有一个火花数据框,其中一列的日期格式为dd-MMM-yyyy hh:mm。
如何进行TimeRange查询,如 -
查找2个日期之间和特定时间范围内的所有行 下午4点到凌晨1点。
使用DatePart Specific Time Range Query in SQL Server
可以在sql中实现如何在Spark Dataframe中执行相同操作。
例如,
我想找到2016年3月23日至2016年3月25日之间的所有行, 在 13:00:00至18:00:00 的时间范围内。
所以我必须得到一行结果。
var input = spark.createDataFrame(Seq(
(13L, "Abhi c", "22-MAR-2016 09:10:12"),
(11L, "VF", "23-MAR-2016 16:24:25"),
(12L, "Alice Jones", "24-MAR-2016 19:20:25")
)).toDF("id", "name", "time")
input.filter("time between '23-MAR-2016' and '25-MAR-2016'").show()
+---+-----------+--------------------+
| id| name| time|
+---+-----------+--------------------+
| 11| VF|23-MAR-2016 16:24:25|
| 12|Alice Jones|24-MAR-2016 19:20:25|
+---+-----------+--------------------+
我的上述查询仅过滤了日期,甚至我可以给出时间,但是如何在每天的时间范围内获取行。
答案 0 :(得分:3)
您可以这样做:
import org.apache.spark.sql.functions.unix_timestamp
var input = spark.createDataFrame(Seq(
(13L, "Abhi c", "22-MAR-2016 09:10:12"),
(11L, "VF", "23-MAR-2016 16:24:25"),
(12L, "Alice Jones", "24-MAR-2016 19:20:25")
)).toDF("id", "name", "time")
val h = hour(unix_timestamp($"time", "dd-MMM-yyyy hh:mm:ss").cast("timestamp"))
input.withColumn("hour", h).filter("time BETWEEN '23-MAR-2016' AND '25-MAR-2016' AND hour BETWEEN 13 AND 18").show()
+---+----+--------------------+----+
| id|name| time|hour|
+---+----+--------------------+----+
| 11| VF|23-MAR-2016 16:24:25| 16|
+---+----+--------------------+----+
答案 1 :(得分:0)
如果您不想在数据框中添加任何新的中间列,则可以使用以下。
import org.apache.spark.sql.functions._
var input = spark.createDataFrame(Seq((13L, "Abhi c", "22-MAR-2016 09:10:12"), (11L, "VF", "23-MAR-2016 16:24:25"), (12L, "Alice Jones", "24-MAR-2016 19:20:25"))).toDF("id", "name", "time")
val ts = unix_timestamp($"time", "dd-MMM-yyyy HH:mm:ss").cast("timestamp")
input.filter("time between '23-MAR-2016' and '25-MAR-2016'").filter(hour(ts) >= 13 && hour(ts) <= 18).show
输出:
+---+----+--------------------+
| id|name| time|
+---+----+--------------------+
| 11| VF|23-MAR-2016 16:24:25|
+---+----+--------------------+
答案 2 :(得分:0)
有一个函数可以检索时间戳的小时。以下是在PySpark中选择上午10点至下午1点之间的数据的方法:
from pyspark.sql.functions import hour
data.select("ts").where((hour("ts") > 10) & (hour("ts") < 13))
您可以进一步使用pyspark.sql.functions.month
,pyspark.sql.functions.year
或pyspark.sql.functions.dayofmonth