Apache spark 在2个特定时间范围之间触发数据帧查询

Apache spark 在2个特定时间范围之间触发数据帧查询,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,我有一个spark数据框,其中一列的日期格式为dd-MMM-yyy-hh:mm 如何进行时间范围查询- 查找2个日期之间以及特定时间范围内的所有行 下午4点到1点 这在sql中可以通过使用DatePart实现 如何在Spark Dataframe中执行相同的操作 比如说, 我想查找2016年3月23日至2016年3月25日之间的所有行, 仅在13:00:00至18:00:00的时间范围内 所以我只能得到一行作为结果 var input = spark.createDataFrame(Seq(

我有一个spark数据框,其中一列的日期格式为dd-MMM-yyy-hh:mm

如何进行时间范围查询-

查找2个日期之间以及特定时间范围内的所有行 下午4点到1点

这在sql中可以通过使用DatePart实现

如何在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|
+---+-----------+--------------------+

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

您可以这样做:

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|
+---+----+--------------------+----+

您可以这样做:

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|
+---+----+--------------------+----+

如果不想向数据帧添加任何新的中间列,可以在case中使用以下命令

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

如果不想向数据帧添加任何新的中间列,可以在case中使用以下命令

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

有一个函数可以检索时间戳的小时数。以下是如何在中选择上午10点到下午1点之间的数据:

从pyspark.sql.functions导入
数据。选择(“ts”)。其中((小时(“ts”)>10)和(小时(“ts”)<13))

您可以进一步使用进行筛选,例如,
pyspark.sql.functions.month
pyspark.sql.functions.year
,或
pyspark.sql.functions.dayofmonth
有一个函数用于检索时间戳的小时数。以下是如何在中选择上午10点到下午1点之间的数据:

从pyspark.sql.functions导入
数据。选择(“ts”)。其中((小时(“ts”)>10)和(小时(“ts”)<13))
您可以进一步筛选,例如,
pyspark.sql.functions.month
pyspark.sql.functions.year
,或
pyspark.sql.functions.dayofmonth