2013-12-18 7 views
8

を見る/爆発:ハイブは、私は、次のスキーマを持つハイブテーブル持って横方向には複数のアレイ

COOKIEを| PRODUCT_ID | CAT_ID |私は次の結果を

クッキーを得るようQTY
1234123 [1,2,3] [R、T、ヌル] [2,1は、ヌル]

どのようにアレイを正規化することができ| 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(http://github.com/klout/brickhouse)のnumeric_rangeおよびarray_index UDFを使用できます。これらのUDFを使用しhttp://brickhouseconfessions.wordpress.com/2013/03/07/exploding-multiple-arrays-at-the-same-time-with-numeric_range/

の上で詳細に記述した有益なブログ投稿があり、クエリは

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クッキー、IF(n> = size(array1)、array_index(array1、n)、null)、IF(n> = size(array2)、array_index(array2、n)..... –

8

ようなものになるだろう、私は posexplodeがあり、任意のUDFを使用せずに、この問題に非常に良い解決策を見つけました非常に良い解決策:

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

あなたの配列が同じ長さを持つ必要があるという警告と推測してください。そうでなければ、最短の長さに切り捨てるでしょう。 – Davos

+0

「WHERE seqp = seqc AND seqc = seqq」のために最短の時間がかかります。パフォーマンスには影響があります。 –

関連する問題