Hive TRANSFORM recibe NULL para valores de matriz concatenados

Aug 21 2020

Tengo una tabla de colmena en el formato:

   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              
    .
    .

Cada valor en col1 puede tener múltiples valores en col2 y cada par de (col1, col2) puede tener múltiples valores de col3 .

Estoy ejecutando la consulta [Q] :

select col1, col2, collect_list(col3) from {table} group by col1, col2;

Llegar:

a1   b1   [c1, c2]
a1   b2   [c2, c3]
a2   b3   [c1]
a2   b4   [c1, c2, c3] 

Quiero hacer algunas transformaciones usando un UDF de python. Así que estoy pasando todas estas columnas a UDF usando la cláusula TRANSFORM como:

select TRANSFORM ( * ) using 'python udf.py' FROM 
(
select col1, col2, concat_ws('\t', collect_list(col3)) from {table} group by col1, col2;
)

Estoy usando concat_ws para convertir la salida de la matriz en una cadena de la lista de recopilación concatenada por un separador. Obtengo col1, col2 como resultado, pero no obtengo la salida col3.

+---------+---------+
|      key|    value|
+---------+---------+
|a1       | b1      |
|         |     null|
|a1       | b2      |
|         |     null|
|a2       | b3      |
|         |     null|
|a2       | b4      |
|         |     null|
+---------+---------+

En mi UDF, solo tengo una declaración de impresión que imprime la línea recibida de stdin.

import sys
for line in sys.stdin:
    try:
        print line
    except Exception as e:
        continue

¿Puede alguien ayudarme a averiguar por qué no obtengo el col3 en mi UDF?

Respuestas

1 serge_k Aug 23 2020 at 02:41

Primero, debe analizar la línea en Python UDF, por ejemplo,

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

Entonces es mejor usar otra cosa en lugar de \ten concat_ws

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;