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 encontrar la línea actual en ejecución desde un archivo hql.

Tengo un archivo sample.hql que contiene las siguientes líneas:

desc db.table1;
desc db.table2;
desc db.table3;

Estoy tratando de ejecutarlo desde el comando de la terminal.
Quiero saber si una columna en particular está presente en la tabla o no.
Por ejemplo, si col1 está presente en table1, el resultado debería decir “col1 se encuentra en db.table1”.

No estoy seguro de cómo encontrarlo.
Estoy ejecutando el siguiente comando:

hive -f sample.hql | grep -q "<nombre_columna>"

Pero no estoy seguro de cómo obtener el nombre de la base de datos y la tabla de cada línea ejecutada.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para extraer los nombres de la base de datos y de la tabla a partir de la salida del comando desc en el archivo sample.hql, puedes utilizar el siguiente comando:

    hive -f sample.hql | grep -w -H -o '<nombre_columna>' | sed 's/\([^\.]*\)\.\([^\.]*\).*/\2 \1/g' | awk '{print $2 " encontrado en " $1}' | uniq
    

    Aquí tienes una explicación de lo que hace cada paso:

    1. hive -f sample.hql: Esto ejecuta el script de Hive sample.hql y muestra la salida en STDOUT.
    2. grep -w -H -o '<nombre_columna>': Esto busca la coincidencia exacta de <nombre_columna> en la salida del comando anterior y muestra únicamente el patrón coincidente, con la opción -o.
    3. sed 's/\([^\.]*\)\.\([^\.]*\).*/\2 \1/g': Esto utiliza una expresión regular para extraer los nombres de la base de datos y de la tabla a partir de la salida del comando desc. Busca un patrón de <nombre_base_de_datos>.<nombre_tabla>.<nombre_columna> y lo reemplaza con <nombre_tabla> <nombre_base_de_datos>. Esto te dará una lista de pares de nombre de tabla y nombre de base de datos para cada nombre de columna coincidente.
    4. awk '{print $2 " encontrado en " $1}': Esto reorganiza la salida para que coincida con el formato de salida deseado "<nombre_columna> encontrado en <nombre_base_de_datos>.<nombre_tabla>". Imprime la segunda columna (es decir, el nombre de la tabla), seguido de la cadena “encontrado en” y luego la primera columna (es decir, el nombre de la base de datos).
    5. uniq: Esto elimina cualquier duplicado de la salida, en caso de que el mismo nombre de columna se encuentre en varias tablas.

    Por ejemplo, si ejecutas el comando con <nombre_columna> establecido como “col_1”, la salida será algo como esto:

    col_1 encontrado en db.tabla1
    col_1 no encontrado en db.tabla2
    col_1 encontrado en db.tabla3

Comments are closed.