Hive fila a columna [dividir una fila en varias filas/una columna en varias columnas]

Escenas:

colmena tiene una tabla armmttxn_tmp, que tiene un campo número_lote. Este campo separa varios valores con comas, y cada valor usa dos puntos para separar el número de material y la cantidad, como: A3220089: -40, A3220090: -40, A3220091 : A 3220085: -40, A3220094: -40.

Requerir:

Divida este campo y enumere el número de material y la cantidad por separado, es decir, en dos columnas.

datos sin procesar:

select 
key_id,
lot_number 
from armmttxn_tmp
where key_id = '48641906';

Funciones utilizadas: dividir(), explotar()

 paso:

Paso 1: Dividir con comas, de la siguiente manera:

["A3220089:-40","A3220090:-40","A3220091:-40","A3220083:-40","A3220087:-40","A3220086:-40","A3220088:-40", "A3220084:-40","A3220081:-40","A3220082:-40","A3220092:-40","A3220093:-40","A3220085:-40","A3220094:-40"]

Utilice la función de división para dividir los datos.

select 
key_id ,
split(lot_number, ',') lot_number
from armmttxn_tmp
where key_id = '48641906';

 Paso 2: una línea se convierte en varias líneas

select 
explode(split(lot_number, ',')) lot_number
from armmttxn_tmp
where key_id = '48641906';

 ¿Qué pasará si se agrega aquí el campo key_id?

Solución de SQL [10081] [42000]: Error al compilar la declaración: FALLADO: SemanticException [Error 10081]: Las UDTF no se admiten fuera de la cláusula SELECT ni están anidadas en expresiones

Motivo: cuando se utiliza la función UDTF, Hive solo permite el acceso al campo dividido.
Entonces, puedes usarlo así: selecciona explode(split(lot_number, ',')) lot_number from armttxn_tmp donde key_id = '48641906'; 

Pero no se puede usar así: seleccione key_id, explotar(split(lot_number, ',')) lot_number from armttxn_tmp donde key_id = '48641906';

¿Qué sucede si desea acceder a campos que no sean campos divididos? ¡
Utilice la vista lateral!

La vista lateral es una vista lateral, que se utiliza con UDTF para dividir una determinada fila de datos en varias filas de datos. UDTF sin vista lateral solo puede extraer una división de un solo campo y no se puede incluir en la tabla de datos original. Agregar vista lateral Puede asociar los datos de campo único divididos con los datos de la tabla original.

Nota: Debe especificar un alias de vista cuando utilice la vista lateral

--Nombre de tabla vista lateral UDTF(xxx) alias de vista (nombre de tabla virtual) como a,b,c (alias de columna)

--La ​​vista lateral explosionada equivale a una tabla virtual que divide el campo número_lote y luego lo asocia con la tabla original.

Paso 3: asociar los campos divididos con los datos de la tabla original.

select 
key_id ,
split(view.*,':') lot_number
from armmttxn_tmp lateral view explode(split(lot_number, ',')) view
where key_id = '48641906';

Pero no es el resultado final que queremos, también necesitamos dividir número_lote en dos columnas.

paso 4: dividir en dos columnas

select 
key_id ,
split(view.*,':')[size(split(view.*, ':'))-2] as lot_number,
split(view.*,':')[size(split(view.*, ':'))-1] as quantity
from armmttxn_tmp lateral view explode(split(lot_number, ',')) view
where key_id = '48641906';

Supongo que te gusta

Origin blog.csdn.net/Allenzyg/article/details/132873370
Recomendado
Clasificación