Заполнение пропущенных значений импалы / улья аналогично LOCF (последнее наблюдение перенесено) - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть данные временных рядов в Импале, которые в этом формате.

Одна запись создается тогда и только тогда, когда есть изменения, обновленное значение представляет новые данные.

---------------------------------------
| Product | Year | Week | UpdatedValue |
---------------------------------------
|A        | 2017 | 1    | 5            |
|A        | 2017 | 5    | 10           |
|A        | 2017 | 20   | 80           |
|B        | 2017 | 8    | 90           |
|...      | ...  | ...  | ...          |
---------------------------------------

Предполагая, что наше временное окно - 2017 полный год с первой недели до недели 52. Приведенные выше данные говорят о том, что значение, измененное для продукта А на первой неделе, составило 5, 5-ю неделю до10 и 20-я неделя, чтобы быть 80. Я хочу заполнить пропущенное значение с помощью логики переноса последнего наблюдения, а если данные не начинаются с первой недели, то также заполнить пропущенные начальные значения следующейвхождение.

Это должно быть идеальным выходом.

---------------------------------------
| Product | Year | Week | UpdatedValue |
---------------------------------------
|A        | 2017 | 1    | 5            |
|A        | 2017 | .    | 5            |
|A        | 2017 | 4    | 5            |
|A        | 2017 | 5    | 10           |
|A        | 2017 | 6    | 10           |
|A        | 2017 | .    | 10           |
|A        | 2017 | 20   | 80           |
|A        | 2017 | .    | 80           |
|A        | 2017 | 52   | 80           |
|B        | 2017 | 1    | 90           |
|B        | 2017 | .    | 90           |
|B        | 2017 | 8    | 90           |
|B        | 2017 | .    | 90           |
|B        | 2017 | 52   | 90           |
|...      | ...  | ...  | ...          |
---------------------------------------

Есть ли выполнимое решение Hive / Impala, в котором вы наверняка сможете использовать их расширенные аналитические функции, если это проще?Однако, если доступно универсальное решение SQL, это будет здорово.

1 Ответ

0 голосов
/ 27 ноября 2018

Шаг 1. Создайте таблицу с числами.

create table if not exists tblNumbers
location 'hdfs_location' as 
select 1 as num
union all 
select 2 as num
....

Шаг 2. Соедините уникальные товары, год с числами и оставьте соединение с исходной таблицей, чтобы создать недостающие строки для товара.Затем используйте логику промежуточной суммы для генерации групп для группировки последовательных строк пропущенных значений, после чего вы можете использовать max для генерации значений для пропущенных строк из последнего найденного значения.

select product,year,week,max(val) over(partition by product,year,grp) as new_val
from (select py.product,py.year,n.week,t.val
      ,sum(case when t.val is not null then 1 else 0 end) 
       over(partition by py.product,py.year order by n.week) as grp
      from tblNumbers n
      cross join (select distinct product,year from tbl) py
      left join tbl t on n.week = t.week and py.product = t.product and py.year = t.year
     ) t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...