2013-05-15 47 views
2

我有這張桌子。在配置單元中,如何在2行之間進行計算?

+------------------------------------------------------------+ 
    |  ks  |  time  |  val1  | val2  | 
    +-------------+---------------+---------------+--------------+ 
    |  A  |  1  |  1  |  1  | 
    |  B  |  1  |  3  |  5  | 
    |  A  |  2  |  6  |  7  | 
    |  B  |  2  |  10  |  12  | 
    |  A  |  4  |  6  |  7  | 
    |  B  |  4  |  20  |  26  | 
    +------------------------------------------------------------+ 

我想爲每個行,

ks | time | val1 | val1 of next ts of same ks | 

需要明確的是,上述例子的結果應該是,

+------------------------------------------------------------+ 
    |  ks  |  time  |  val1  | next.val1 | 
    +-------------+---------------+---------------+--------------+ 
    |  A  |  1  |  1  |  6  | 
    |  B  |  1  |  3  |  10  | 
    |  A  |  2  |  6  |  6  | 
    |  B  |  2  |  10  |  20  | 
    |  A  |  4  |  6  |  null | 
    |  B  |  4  |  20  |  null | 
    +------------------------------------------------------------+ 

(我需要爲值2相同的下以及)

我想了很多想出這個蜂巢查詢,但仍然沒有運氣。我可以在上面提到的here(Quassnoi的回答)中爲sql編寫查詢,但是無法在hive中創建等價物,因爲hive不支持select中的子查詢。

有人可以幫我實現嗎?

在此先感謝。

編輯:

查詢我試過了,

SELECT ks, time, val1, next[0] as next.val1 from 
(SELECT ks, time, val1 
     COALESCE(
     (
     SELECT Val1, time 
     FROM myTable mi 
     WHERE mi.val1 > m.val1 AND mi.ks = m.ks 
     ORDER BY time 
     LIMIT 1 
     ), CAST(0 AS BIGINT)) AS next 
FROM myTable m 
ORDER BY time) t2; 
+0

讓我看看你的查詢 –

+0

用查詢更新了問題。謝謝。 – Bee

+0

請更新您的問題和示例以反映您在下面提及的其他要求。謝謝。 –

回答

2

您的查詢似乎頗爲相似,「年前」報告是在財務報告中普遍存在。我認爲LEFT OUTER JOIN是你正在尋找。

我們將表myTable連接到它自己,命名同一個表mn的兩個實例。對於第一個表m中的每個條目,我們將嘗試使用相同的ks值查找n中的匹配記錄,但會增加值time。如果此記錄不存在,則n的所有列值將爲NULL

SELECT 
    m.ks, 
    m.time, 
    m.val1, 
    n.val1 as next_val1, 
    m.val2, 
    n.val2 as next_val2 
FROM 
    myTable m 
LEFT OUTER JOIN 
    myTable n 
ON (
    m.ks = n.ks 
AND 
    m.time + 1 = n.time 
); 

返回以下內容。

ks time val1 next_val1 val2 next_val2 
A 1  1  6   1  7 
A 2  6  6   7  7 
A 3  6  NULL  7  NULL 
B 1  3  10   5  12 
B 2  10 20   12 26 
B 3  20 NULL  26 NULL 

希望有所幫助。

+0

嗨盧卡斯,謝謝你的回覆,但我的情況有點不同。對不起,我的例子誤導了你。在這種情況下,時間不一定總是增加1。它也可能有更大的差距。所以我們不能使用'm.time + 1 = n.time'。謝謝。 – Bee

+1

在這種情況下,我會建議你使用子查詢首先命令myTable「按ks,time」,然後添加行號。然後,您可以在上面的連接中使用行號,而不是時間。希望有所幫助。 –

+0

我有這個想法,但我找不到添加行號列的方法。請問訂購後請告訴我該怎麼做? – Bee

2

我發現使用Hive自定義地圖/縮減功能非常適合解決與此類似的查詢。它使您有機會考慮一組輸入並「減少」到一個(或更多)結果。

answer討論瞭解決方案。

關鍵是您使用CLUSTER BY將具有相似鍵值的所有結果發送到同一個reducer,因此相同的reduce腳本,相應地收集,然後在鍵更改時輸出減少的結果,並開始收集新的鍵。

+0

謝謝,我會看看。 – Bee

相關問題