Улей: Как узнать базу значений на основе значения предыдущего ряда? - PullRequest
1 голос
/ 24 марта 2020

У меня есть данные в стиле IoT. Я должен заменить «нет» значением, которое приходит в ближайшее время из этого «нет» (значение этого ближайшего времени не равно «нет»).

Исходные данные:

+---------------------+--------+
|     time            | value  |
|---------------------+--------+
| 2020-01-01 11:11:10 | "0.3"  |
| 2020-01-01 11:11:11 | "0.2"  |
| 2020-01-01 11:11:12 | "none" |
| 2020-01-01 11:11:13 | "none" |
| 2020-01-01 11:11:14 | "none" |
| 2020-01-01 11:11:15 | "0.1"  |
| 2020-01-01 11:11:16 | "none" |
| 2020-01-01 11:11:17 | "0.4"  |
+---------------------+--------+


Окончательные данные будут такими:

+---------------------+--------+
|     time            | value  |
|---------------------+--------+
| 2020-01-01 11:11:10 | "0.3"  |
| 2020-01-01 11:11:11 | "0.2"  |
| 2020-01-01 11:11:12 | "0.2"  |
| 2020-01-01 11:11:13 | "0.2"  |
| 2020-01-01 11:11:14 | "0.2"  |
| 2020-01-01 11:11:15 | "0.1"  |
| 2020-01-01 11:11:16 | "0.1"  |
| 2020-01-01 11:11:17 | "0.4"  |
+---------------------+--------+


Ответы [ 2 ]

1 голос
/ 24 марта 2020

Позвольте мне предположить, что "нет значения" на самом деле NULL. Тогда вы хотите LAG(IGNORE NULLS), но Hive не поддерживает это. Но вы можете сделать это в два этапа. Определите группы путем подсчета количества «реальных» значений до каждой строки. Затем используйте функции окна, чтобы присвоить значение:

select t.*, max(value) over (partition by grp)
from (select t.*,
             count(value) over (order by time) as grp
      from t
     ) t

РЕДАКТИРОВАТЬ:

Если вы на самом деле храните значения в виде строк , а 'none' - это реальное значение, тогда просто используйте вариант выше:

select t.*,
       max(nullif(value, 'none')) over (partition by grp)
from (select t.*,
             count(nullif(value, 'none')) over (order by time) as grp
      from t
     ) t
0 голосов
/ 24 марта 2020

Ваша проблема похожа на В HIVE замена значения NULL на те же значения столбца с использованием COALESCE

с одним небольшим отличием:

with rank_table as ( 
select *, SUM(value) OVER (ORDER BY time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as rnk
  from your_table
)
select *, max(value) over (partition by rnk)
  from rank_table  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...