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