Hive TRANSFORM empfängt NULL für verkettete Array-Werte
Ich habe eine Hive-Tabelle im Format:
col1. col2. col3.
a1 b1 c1
a1 b1 c2
a1 b2 c2
a1 b2 c3
a2 b3 c1
a2 b4 c1
a2 b4 c2
a2 b4 c3
.
.
Jeder Wert in col1 kann mehrere Werte in col2 haben und jedes solche Paar von (col1, col2) kann mehrere Werte von col3 haben .
Ich führe die Abfrage [Q] aus :
select col1, col2, collect_list(col3) from {table} group by col1, col2;
bekommen:
a1 b1 [c1, c2]
a1 b2 [c2, c3]
a2 b3 [c1]
a2 b4 [c1, c2, c3]
Ich möchte einige Transformationen mit einer Python-UDF durchführen. Also übergebe ich alle diese Spalten mit der TRANSFORM-Klausel an UDF wie folgt:
select TRANSFORM ( * ) using 'python udf.py' FROM
(
select col1, col2, concat_ws('\t', collect_list(col3)) from {table} group by col1, col2;
)
Ich verwende concat_ws, um die Array-Ausgabe von collect_list, verkettet durch ein Trennzeichen, in strig zu konvertieren. Ich bekomme col1, col2 als Ergebnis, bekomme aber nicht die Ausgabe von col3.
+---------+---------+
| key| value|
+---------+---------+
|a1 | b1 |
| | null|
|a1 | b2 |
| | null|
|a2 | b3 |
| | null|
|a2 | b4 |
| | null|
+---------+---------+
In meinem UDF habe ich nur eine print-Anweisung, die die von stdin empfangene Zeile druckt.
import sys
for line in sys.stdin:
try:
print line
except Exception as e:
continue
kann jemand helfen, herauszufinden, warum ich die col3 nicht in meiner UDF erhalte?
Antworten
Zuerst müssen Sie die Zeile in Python UDF parsen, z. B.
import sys
for line in sys.stdin:
try:
line = line.strip('\n')
col1, col2, col3 = line.split('\t')
print '\t'.join([col1, col2, col3])
except Exception as e:
continue
Dann ist es besser, statt \tin concat_ws etwas anderes zu verwenden
select TRANSFORM ( * ) using 'python udf.py' as (col1, col2, col3)
FROM
(
select col1, col2, concat_ws(',', collect_list(col3)) from {table} group by col1, col2;