Wie man die ersten n Elemente in einem array im Hive
Verwende ich die split-Funktion ein array erstellen, in den Bienenstock, wie bekomme ich die ersten n Elemente aus dem array ab, und ich möchte Sie gehen Sie durch die sub-array -
code-Beispiel
select col1 from table
where split(col2, ',')[0:5]
'[0:5]", sieht mag python-Stil, aber es funktioniert hier nicht.
- was genau beabsichtigen Sie zu tun mit n Elementen? Sie wollen, dass jedes element in einer separaten Zeile oder eine Spalte getrennt?
- Ich möchte Ihnen in einer separaten Zeile, und ich möchte die Statistik das Verhältnis von einigem Wert in den ersten n Elemente. Angenommen ich habe Zeile-format wie "abc#1,def#2,hij#3"... nun, ich will wissen, was ist das Verhältnis von #1 oder #2 in den ersten drei Elemente.
- es geschrieben als Antwort..
- Ovbiously, Sie sind nicht qualifiziert, um wählen Sie die richtige Antwort auf diese Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine knifflige Sache.
Zunächst nehmen die Dosen aus Glas hier
Dann fügen Sie es zu Hive :
add jar /path/to/jars/brickhouse-0.7.0-SNAPSHOT.jar;
Erstellen Sie nun die beiden Funktionen werden wir aufzuhalten der Benutzung :
CREATE TEMPORARY FUNCTION array_index AS 'brickhouse.udf.collect.ArrayIndexUDF';
CREATE TEMPORARY FUNCTION numeric_range AS 'brickhouse.udf.collect.NumericRange';
Wird die Abfrage :
select a,
n as array_index,
array_index(split(a,','),n) as value_from_Array
from ( select "abc#1,def#2,hij#3" a from dual union all
select "abc#1,def#2,hij#3,zzz#4" a from dual) t1
lateral view numeric_range( length(a)-length(regexp_replace(a,',',''))+1 ) n1 as n
Erklärt :
select "abc#1,def#2,hij#3" a from dual union all
select "abc#1,def#2,hij#3,zzz#4" a from dual
Ist einfach nur die Auswahl einige test-Daten, in Ihrem Fall ersetzen Sie diese mit Ihrem Namen Tabelle.
lateral view numeric_range( length(a)-length(regexp_replace(a,',',''))+1 ) n1 as n
numeric_range ist eine UDTF, die eine Tabelle zurückgibt, die für einen bestimmten Bereich, in diesem Fall, ich bat um einen Bereich zwischen 0 (default) und die Anzahl der Elemente im string (berechnet als die Anzahl der Kommas + 1)
Auf diese Weise wird jede Zeile multipliziert mit der Anzahl der Elemente in der gegebenen Spalte.
array_index(split(a,','),n)
Dies ist genau wie mit
split(a,',')[n]
aber hive nicht unterstützt.So erhalten wir die n-te-element für jede duplizierte Zeile der ersten Zeichenfolge ergibt :
abc#1,def#2,hij#3,zzz#4 0 abc#1
abc#1,def#2,hij#3,zzz#4 1 def#2
abc#1,def#2,hij#3,zzz#4 2 hij#3
abc#1,def#2,hij#3,zzz#4 3 zzz#4
abc#1,def#2,hij#3 0 abc#1
abc#1,def#2,hij#3 1 def#2
abc#1,def#2,hij#3 2 hij#3
Wenn Sie wirklich wollen, eine bestimmte Anzahl von Elementen (sagen wir 5) dann einfach verwenden :
lateral view numeric_range(5 ) n1 as n
Dies ist eine viel einfachere Weg, es zu tun. Es gibt eine UDF hier genannt
TruncateArrayUDF.java
können tun, was Sie Fragen. Nur Klon der repo von der Hauptseite aus und bauen Sie das Glas mit Maven.Beispiel Daten:
- Abfrage:
Ausgabe:
TruncateArray
UDF. Auchposexplode
nur von hive 0.13.