【问题标题】:Spark DataFrame query between 2 specific Time Range2个特定时间范围之间的Spark DataFrame查询
【发布时间】:2017-07-01 07:21:40
【问题描述】:

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

如何做TimeRange查询-

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

这可以在 sql 中使用 DatePart Specific Time Range Query in SQL Server

如何在 Spark Dataframe 中做同样的事情。

例如,

我想查找 23-MAR-2016 到 25-MAR-2016 之间的所有行, 仅限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|
+---+-----------+--------------------+

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

【问题讨论】:

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


    【解决方案1】:

    你可以这样做:

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

    【讨论】:

      【解决方案2】:

      有一个函数可以检索时间戳的小时数。以下是如何在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

      【讨论】:

        【解决方案3】:

        如果您不想向数据框添加任何新的中间列,则可以使用以下内容。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-20
          • 2021-09-17
          • 1970-01-01
          相关资源
          最近更新 更多