Spark DataFrame查询2个特定时间范围

时间:2017-02-13 10:28:06

标签: apache-spark pyspark apache-spark-sql

我有一个火花数据框,其中一列的日期格式为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|
+---+-----------+--------------------+

我的上述查询仅过滤了日期,甚至我可以给出时间,但是如何在每天的时间范围内获取行。

3 个答案:

答案 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.monthpyspark.sql.functions.yearpyspark.sql.functions.dayofmonth

进行过滤