es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo obtener una vista completa de los datos de dos tablas en Hive?

Tengo dos tablas en Hive (arch y noarch) con la siguiente estructura:

Table1Arch Table2NoArch
trid trid
resid resid
infojson infojson
createdat
updatedat

Necesito obtener una vista completa de datos de arch + noarch y unirlos por res_id.

Intenté hacer diferentes variaciones de uniones izquierdas, pero estaba obteniendo resultados solo de arch y nada de noarch, o viceversa. Supongo que debería haber usado union all, pero estoy teniendo dificultades para escribirlo correctamente.

¿Podría por favor ayudarme con la consulta correcta?

EDITAR:

Me gustaría obtener una vista unida para estas dos tablas cuando busque ciertos res_ids.

Supongamos que tengo los siguientes datos:

Entry1Arch Entry2Arch
1 2
111 222
{“something 1”} {“something 2”}
Entry3NoArch Entry4NoArch
3 4
333 444
{“something 3”} {“something 4”}
2021-10-03 21:01:44.0 2021-10-04 21:02:43.0
2021-10-03 21:01:44.0 2021-10-04 21:02:43.0

El objetivo final es obtener los datos completos de ambas tablas: 111 + 222 + 333 + 444.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener una vista completa de los datos de las tablas arch y noarch unidas por res_id, puedes utilizar el operador de UNION ALL. La consulta debería verse así:

    SELECT tr_id, res_id, info_json, created_at, updated_at
    FROM arch
    UNION ALL
    SELECT NULL as tr_id, res_id, info_json, created_at, updated_at
    FROM noarch
    WHERE res_id NOT IN (SELECT res_id FROM arch);
    

    Esta consulta combinará todas las filas de ambas tablas, incluso si hay duplicados, e incluirá NULL para los campos que no estén presentes en una de las tablas. La cláusula WHERE filtra los registros de noarch que ya existen en arch basándose en su res_id.

    Para recuperar los datos para valores de res_id específicos, puedes agregar una condición de WHERE de esta forma:

    SELECT tr_id, res_id, info_json, created_at, updated_at
    FROM arch
    WHERE res_id IN ('111', '222', '333', '444')
    UNION ALL
    SELECT NULL as tr_id, res_id, info_json, created_at, updated_at
    FROM noarch
    WHERE res_id NOT IN (SELECT res_id FROM arch)
    AND res_id IN ('111', '222', '333', '444');
    

    Esto devolverá los datos completos de los valores de res_id especificados de ambas tablas. La condición de WHERE restringe el conjunto de resultados para incluir solo los valores de res_id especificados en ambas tablas.

Comments are closed.