2017-02-13 13 views
0

У меня есть блок данных искры с столбцом, имеющим дату в формате dd-MMM-yyyy hh: mm.Spark DataFrame запрос между двумя конкретными временными диапазонами

Как сделать TimeRange запрос типа -

Найти все строки между 2 датами и в пределах определенного диапазона времени 4PM к 1AM.

Это возможно в SQL с помощью DatePart Specific Time Range Query in SQL Server

Как сделать то же самое в Спарк 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| 
+---+-----------+--------------------+ 

Мой выше запрос только фильтруется дату и даже я могу дать время, но как получить строки в пределах диапазона времени каждый день.

ответ

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

Вы можете использовать следующие в случае , если вы не хотите, чтобы добавить новые промежуточные столбцы вашему dataframe.

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

 Смежные вопросы

  • Нет связанных вопросов^_^