2013-12-18 12 views
8

ich einen Bienenstock-Tabelle mit dem folgenden Schema haben:Hive Aufreißen/Seitenansicht mehrere Arrays

COOKIE | PRODUKT_ID | CAT_ID | MENGE
1.234.123 [1,2,3] [r, t, null] [2,1, null]

Wie kann ich normalisieren die Arrays so dass ich das folgende Ergebnis

PLÄTZCHEN erhalten | PRODUKT_ID | CAT_ID | STCK

1234123 [1] [R] [2]

1234123 [2] [t] [1]

1234123 [3] null null

habe ich versucht, die folgenden :

aber das Ergebnis kommt als ein kartesisches Produkt heraus.

Antwort

12

Zur Lösung dieses Problems können Sie die UDFs numeric_range und array_index von Brickhouse (http://github.com/klout/brickhouse) verwenden. Es ist ein informatives im Detail beschreibt, Blog-Posting über bei http://brickhouseconfessions.wordpress.com/2013/03/07/exploding-multiple-arrays-at-the-same-time-with-numeric_range/

diese UDF verwenden, würde die Abfrage so etwas wie

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

Danke, das hat perfekt funktioniert. – user2726995

+0

@Jerome .. würde dies funktionieren, wenn das Array von verschiedenen Größen ist ..? –

+0

Ich bin nicht sicher, dass verschiedene Array-Größen sinnvoll wären. Dann müssten Sie überprüfen, ob n größer als das aktuelle Array ist. Etwas wie . SELECT-Cookie, IF (n> = Größe (array1), array_index (array1, n), null), IF (n> = Größe (array2), array_index (array2, n) ..... –

8

ich sein, eine sehr gute Lösung für dieses Problem gefunden, ohne eine UDF zu verwenden, posexplode ist eine sehr gute Lösung:

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, das funktioniert! I denke mit dem Vorbehalt, dass deine Arrays die gleiche Länge haben müssen, und wenn sie es nicht tun, wird sie auf die Länge des kürzesten verkürzt, und ich bin mir nicht sicher, ob das auch immer mehr ist seitliche Ansichten – Davos

+0

Ja, es wird wegen "WHERE seqp = seqc AND seqc = seqq" die kürzeste nehmen, mit Sicherheit werden die Leistungen beeinflusst. –