2013-12-18 5 views
8

여러 배열보기/폭발 :은 하이브가 측면 내가 다음 스키마와 하이브 테이블이

쿠키 | PRODUCT_ID | CAT_ID | 나는 다음과 같은 결과를

쿠키를 얻을 수 있도록 수량
1234123 [1,2,3] [R, t, 널 (null)] [2,1, 널 (null)]

어떻게 배열을 정상화 할 수 있습니다 | PRODUCT_ID | CAT_ID | QTY

1,234,123 [1] [R] [2]

1,234,123 [2] [t] [1]

1,234,123 I가 시도

[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_rangearray_index UDF를 사용하여이 문제를 해결할 수 있습니다. 그 UDF를 사용 http://brickhouseconfessions.wordpress.com/2013/03/07/exploding-multiple-arrays-at-the-same-time-with-numeric_range/

에 걸쳐 자세히 설명하는 정보를 블로그 게시물이 있습니다, 쿼리 posexplode이며,

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

@ 제롬 .. 배열의 크기가 다른 경우이 작업을 수행 할 수 있습니까? –

+0

다른 배열 크기가 맞는지 잘 모르겠습니다. 그렇다면 n이 현재 배열보다 큰지 확인해야합니다. 뭔가. SELECT 쿠키, IF (n> = size (array1), array_index (array1, n), null), IF (n> = size (array2), array_index (array2, n) ..... –

8
내가 어떤 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

그래, "seqp = seqc 및 seqc = seqq"때문에 성능이 영향을받을 수 있으므로 가장 짧은 걸로 예상됩니다. –