首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >星火DataFrame查询在两个特定的时间范围内

星火DataFrame查询在两个特定的时间范围内
EN

Stack Overflow用户
提问于 2017-02-13 10:28:06
回答 3查看 9.1K关注 0票数 1

我有一个火花数据和一个列的日期格式dd-MMM-yyyy :mm。

如何进行TimeRange查询,如-

查找两个日期之间的所有行,并在下午4时至凌晨1时的特定时间范围内查找。

这在sql中使用DatePart Server中的特定时间范围查询是可能的。

如何在中做同样的事情。

例如,

我想找到2016年3月23日至2016年3月25日至2016年3月25日至2016年3月间的所有行,时间范围为13:00至6:00。

所以我只能得到一排。

代码语言:javascript
复制
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|
+---+-----------+--------------------+

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-13 11:21:23

你可以这样做:

代码语言:javascript
复制
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|
+---+----+--------------------+----+
票数 3
EN

Stack Overflow用户

发布于 2020-05-12 12:56:59

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

代码语言:javascript
复制
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来进一步过滤

票数 1
EN

Stack Overflow用户

发布于 2017-02-13 11:54:53

如果您不想将任何新的中间列()添加到dataframe中,则可以使用以下方法来防止。

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
+---+----+--------------------+
| id|name|                time|
+---+----+--------------------+
| 11|  VF|23-MAR-2016 16:24:25|
+---+----+--------------------+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42201822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档