我在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解决方案,那就太好了。
答案 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 ...