2013-12-18 74 views
8

我有以下模式的蜂巢表:蜂巢爆炸/側視多個陣列

COOKIE | PRODUCT_ID | CAT_ID |數量
1234123 [1,2,3] [R,T,空] [2,1,空]

我怎樣才能正常化陣列,所以我得到以下結果

COOKIE | PRODUCT_ID | CAT_ID | QTY

1234123 [1] [R] [2]

1234123 [2] [T] [1]

1234123 [3]空空

我曾嘗試以下:

select concat_ws('|',visid_high,visid_low) as cookie 
,pid 
,catid 
,qty 
from table 
lateral view explode(productid) ptable as pid 
lateral view explode(catalogId) ptable2 as catid 
lateral view explode(qty) ptable3 as qty 

但是結果是作爲笛卡兒積產生的。

回答

12

您可以使用Brickhouse的numeric_rangearray_index UDF(http://github.com/klout/brickhouse)來解決此問題。有一個翔實的博客文章在http://brickhouseconfessions.wordpress.com/2013/03/07/exploding-multiple-arrays-at-the-same-time-with-numeric_range/

了詳細描述使用這些UDF的,查詢會像

select cookie, 
    array_index(product_id_arr, n) as product_id, 
    array_index(catalog_id_arr, n) as catalog_id, 
    array_index(qty_id_arr, n) as qty 
from table 
lateral view numeric_range(size(product_id_arr)) n1 as n; 
+0

謝謝,這工作完美。 – user2726995

+0

@Jerome ..這將能夠工作,如果陣列是不同的大小..? –

+0

我不確定不同的陣列大小是否合理。那麼你將不得不檢查n是否比當前數組大。就像是 。 SELECT cookie,IF(n> = size(array1),array_index(array1,n),null),IF(n> = size(array2),array_index(array2,n)..... –

8

我找到了一個很好的解決了這個問題,而無需使用任何UDF, posexplode是一個非常好的解決方案:

SELECT COOKIE , 
ePRODUCT_ID, 
eCAT_ID, 
eQTY 
FROM TABLE 
LATERAL VIEW posexplode(PRODUCT_ID) ePRODUCT_IDAS seqp, ePRODUCT_ID 
LATERAL VIEW posexplode(CAT_ID) eCAT_ID AS seqc, eCAT_ID 
LATERAL VIEW posexplode(QTY) eQTY AS seqq, eDateReported 
WHERE seqp = seqc AND seqc = seqq;
+0

Hey this works!I猜測你的數組需要具有相同的長度,如果它們不會將它們截斷到最短的長度,我不確定這個性能,特別是越來越多橫向視圖 – Davos

+0

是的,由於「WHERE seqp = seqc AND seqc = seqq」,它會佔用最短的一次,因爲肯定會影響性能。 –