2017-02-13 5 views
0

Ich habe ein Spark-Datenframe mit einer Spalte mit Datum im Format TT-MMM-JJJJ hh: mm.Spark DataFrame Abfrage zwischen 2 spezifischen Zeitbereich

Wie Timerange Abfrage zu tun, wie -

alle Zeilen zwischen zwei Terminen finden und innerhalb bestimmter Zeitbereich von 4.00 bis 01.00 Uhr.

Dies ist möglich, in SQL von Datepart mit Specific Time Range Query in SQL Server

wie diese in der Spark-Datenframe zu tun.

Zum Beispiel

ich von 13.00.00 bis 18.00.00 alle Zeilen zwischen 23-MAR-2016 bis 25-MAR-2016, im Zeitbereich finden will nur.

Also muss ich nur eine Zeile als Ergebnis bekommen.

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

Meine obige Abfrage gefiltert, um nur das Datum und auch ich kann Zeit geben, aber wie Zeilen eines jeden Tages innerhalb eines Zeitbereiches zu erhalten.

Antwort

1

Sie können etwas tun:

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

Sie die folgende im Falle verwenden können wenn Sie keine neuen Zwischen Spalten zu Ihrem Datenrahmen hinzufügen möchten.

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 

Ausgang:

+---+----+--------------------+ 
| id|name|    time| 
+---+----+--------------------+ 
| 11| VF|23-MAR-2016 16:24:25| 
+---+----+--------------------+