2016-05-22 9 views
0

Hallo habe ich einen Hive TabelleHive Tisch Array Columns - explodieren mit array_index

select a,b,c,d from riskfactor_table 
In the above table B, C and D columns are array columns. Below is my Hive DDL 
Create external table riskfactor_table 
(a string, 
b array<string>, 
c array<double>, 
d array<double>) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY '~' 
stored as textfile location 'user/riskfactor/data'; 

Hier ist meine Tabellendaten:

ID400S, [ "jms", "jndi", "jaxb" "jaxn"], [100,200,300,400], [1,2,3,4]
ID200N, ["eins", "zwei", "drei"], [212,352,418], [6,10,8]

Wenn ich Array-Spalten teilen möchte, wie kann ich teilen?
Wenn i Funktion explodiert ich nur eine Array-Werte für die Spalte aufspalten

explodieren wählen (B) wie b von riskfactor_table;

Ausgang:

jms 
jndi 
jaxb 
jxn 
one 
two 
three 

Aber ich möchte, dass alle Spalten unten-

Abfrage gefüllt mit einer select-Anweisung werden - wählen Sie a, b, c, d von risk_factor ;

Ausgang:

row1- ID400S jms 100 1 
row2- ID400S jndi 200 2 
row3- ID400S jaxb 300 3 
row4- ID400S jaxn 400 4 

Wie kann ich alle Daten zu füllen?

+0

Es ist unklar, was Ihre gewünschte Ausgabe ist. Woher kommen 'ID400A',' ID401S' und 'ID402E'? Sie erscheinen magisch am Ende Ihrer Frage. – gobrewers14

+0

Hallo, ich habe meine Ausgabe korrigiert. Können Sie mir bitte helfen, wie kann ich Daten auffüllen? Auch wenn ich einen Null-Array-Wert oder Werte weniger als 4 Felder in meiner Eingabe erhalten, wie die Array-Spalten zuordnen? – Sai

+0

Mögliches Duplikat von [Hive Explode/Lateral View mehrere Arrays] (http: // stackoverflow.com/questions/20667473/hive-explode-lateral-view-multiple-arrays) – gobrewers14

Antwort

0

Sie können diese mit Seitenansicht

 SELECT Mycoulmna, Mycoulmnb ,Mycoulmnc 
       FROM riskfactor_table 
      LATERAL VIEW explode(a) myTablea AS Mycoulmna 
      LATERAL VIEW explode(a) myTableb AS Mycoulmnb 
      LATERAL VIEW explode(a) myTablec AS Mycoulmnc ; 

für mehr erreichen detail es gehen zu werfen.

+0

Ich glaube nicht, das ist, was @sai gefragt. Die 3 lateralen Ansichten ergeben im Grunde das kartesische Produkt der drei Arrays - das heißt, alle Kombinationen aller Elemente jedes Arrays mit allen Elementen in den anderen Arrays. In dem Beispiel möchte er nur die Tupel erhalten, die das i-te Element jedes Arrays erhalten. –

+0

wie pro Probe sucht er nach kartesischen Produkt. –

+0

Hallo ich bin nicht auf der Suche nach kartesischen Produkt von drei Array.Basisch möchte ich alle Werte im Array herausnehmen und laden Sie die Daten in Netezza DB mit sqoop-Export. – Sai

-1

Verwenden Sie die UDF 'numeric_range' von Brickhouse. Hier ist ein Blogbeitrag, der die Details beschreibt.

https://brickhouseconfessions.wordpress.com/2013/03/07/exploding-multiple-arrays-at-the-same-time-with-numeric_range/

In Ihrem Fall würde Ihre Abfrage so etwas wie

SELECT a, 
     array_index(b, i), 
     array_index(c, i), 
     array_index(d, i) 
FROM risk_factor_table 
LATERAL VIEW numeric_range(0, 3); 
+0

Link-Only-Antworten sind nicht nützlich, wenn der Inhalt verschoben oder geändert wird. Fügen Sie die relevanten Teile in Ihre Antwort ein oder geben Sie den Link als Kommentar statt als Antwort ein. – miken32

1

Ich war auch für gleiche Frage Lösung suchen sein. Danke Jerome, für diese Brickhouse-Lösung.

Ich hatte eine leichte Veränderung zu machen (Zusatz von alias „n1 als n“), wie unten, um es meinen Fall funktioniert:

hive> describe test; 
OK 
id    string 
animals  array<string> 
cnt   array<bigint> 

hive> select * from test; 
OK 
abc  ["cat","dog","elephant","dolphin","snake","parrot","ant","frog","kuala","cricket"]  [10597,2027,1891,1868,1804,1511,1496,1432,1305,1299] 

hive> select `id`, array_index(`animals`,n), array_index(`cnt`,n) from test lateral view numeric_range(0,10) n1 as n; 
OK 
abc  cat    10597 
abc  dog    2027 
abc  elephant  1891 
abc  dolphin   1868 
abc  snake   1804 
abc  parrot   1511 
abc  ant    1496 
abc  frog   1432 
abc  kuala   1305 
abc  cricket   1299 

Die einzige Sache ist, ich habe im Voraus zu wissen, dass es 10 Elemente werden explodiert.