Найти самую длинную непрерывную полосу в Spark

#scala #apache-spark #apache-spark-sql #apache-spark-2.3

#scala #Apache-Spark #Apache-spark-sql #Apache-Spark-2.3

Вопрос:

У меня есть фрейм данных с одним столбцом, подобный этому

 ------------
   date     
------------
01/01/2020       
02/01/2020  
04/01/2020    
05/01/2020    
06/01/2020 
 

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

 -----------------------------------------------
start       |   end           |  period_length |
-----------------------------------------------
04/01/2020    06/01/2020             3         
 

Мой подход:
Отсортируйте данные и найдите отставание от предыдущей строки, и всякий раз, когда есть отставание> 1, сбросьте длину периода
Но я не могу найти способ сбросить период при определенном условии.
Я использую Spark 2.3

Ответ №1:

Примечание: мое имя столбца «EventTime», например «2020-12-14 13: 49:32»

   sc.sql(
  """
    |
    |   select
    |     min(eventTime), max(eventTime) ,  count(1)  as counts
    |   from
    |   (
    |       select
    |           eventTime , date_sub(eventTime , rn) as dis
    |       from
    |       (
    |           select
    |               eventTime , row_number() over(partition by 1 order by eventTime) rn
    |           from (select distinct substring(eventTime,0,10) as eventTime from ST_INOUT_RECORD)
    |       ) t1
    |   ) t2
    |   group by dis  having counts > 2
    |
    |""".stripMargin).show()
 

Результат

 |min(eventTime)|max(eventTime)|counts|
 -------------- -------------- ------ 
|    2020-09-12|    2020-12-14|    94|
|    2020-01-01|    2020-09-10|   254|
 -------------- -------------- ------