Apache spark 在2个特定时间范围之间触发数据帧查询
我有一个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的时间范围内 所以我只能得到一行作为结果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(
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