类似于LOCF的缺失值中的Impala / Hive填充(最后的观察结转)

时间:2018-11-27 17:33:27

标签: sql hive impala

我在Impala中有一个采用这种格式的时间序列数据。

只有当发生更改时,才会创建一条记录,更新后的值表示新数据。

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

假设我们的时间范围是从第一周到第52周的2017年全年。上面的数据表明,产品A的价值在第一周的第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 :(得分:1)

步骤1: 用数字创建表。

max

步骤2: 对唯一产品进行交叉连接,将年份与数字交叉,然后对原始表进行左连接,以生成产品的缺失行。然后,使用运行总和逻辑来生成将连续的缺失值行分组的组,然后可以使用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 从最后找到的值生成缺失行的值。

@Remote

public interface ICryptoAPI..



and bean definition:

@Stateless

public class CryptoAPI implements ICryptoAPI ...