2016-03-02 32 views
0

我有一列空值一個數據集:我要添加值行已爲空與先前已知替換空與豬/蜂巢在同一列上已知的行值

price time  id 
1  12:00:00 id1 
10  12:00:00 id2 
NULL 12:05:00 id1 
NULL 12:05:00 id2 
NULL 12:10:00 id2 
2  12:10:00 id1 
3  12:15:00 id1 
NULL 12:20:00 id1 
NULL 12:25:00 id1 
4  12:30:00 id1 

Pig或Hive中每個id /時間的行值。

因此,輸出應該是:

price time  id 
1  12:00:00 id1 
10  12:00:00 id2 
**1** 12:05:00 id1 
**10** 12:05:00 id2 
**10** 12:10:00 id2 
2  12:10:00 id1 
3  12:15:00 id1 
**3** 12:20:00 id1 
**3** 12:25:00 id1 
4  12:30:00 id1 

提前非常感謝。

編輯:這是我在蜂巢正在運行:

Select price,time, id,last_value(price,true) over (partition by id order by time) as LatestPrice from table; 

它的正常工作的某些行(1000),但100%映射完成後,較大的一組(24個M行)和100%減速機,這項工作從最後1天開始仍在運行。任何建議?

+0

你可以在你到目前爲止試過的東西上顯示一些代碼嗎? – LiMuBei

+0

我看起來像這樣:選擇價格,時間,身份證,last_value(價格)結束(由ID按時間分區)作爲LatestPrice從表; – rks

回答

0

你可以嘗試這樣的事情。

select 
    notNullTmp.price, tmp.id, tmp.time 
(
    select LAG(b.time, 1) over (PARTITION BY a.id ORDER BY a.time) as prev_time, b.time as time, b.id as id 
    FROM 
    (
     select price, time, id 
      from table 
      where price is NOT NULL 
    ) a 
    JOIN 
    (
     select price, time, id 
      from table 
      where price is NULL 
    )b 
    ON (a.id = b.id) 
) tmp 
JOIN 
(
    select price, time, id 
     from table 
     where price is NOT NULL 
) notNullTmp 
ON (tmp.id = notNullTmp.id AND tmp.prev_time == notNullTmp.time) 


UNION 

select price, time, id 
    from table 
    where price is NOT NULL; 

的想法是分開空價格記錄氟里昂非空的價格記錄,然後,尋找在一個entry.After非空價格記錄每個空價格記錄ID採摘每個零價的價格條目,我們將這些數據與非空價格數據一起加入。