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.

La condición de Hive en el script de shell no está funcionando como se esperaba.

La condición dentro de la consulta Hive en el script shell no funciona correctamente

Escribí un script shell para enviar alertas por correo electrónico según la condición del resultado de una consulta, pero no importa lo que suceda, siempre se envía solo la segunda parte (parte else), sin importar el resultado de la variable. Por favor, ayude a verificar. A continuación se muestra el script:

#!bin/sh

strata=$(impala cadena de conexión -q "SELECT calendario, COUNT (*) row_count FROM TABLE 
 WHERE calendar = CAST (from_unixtime (unix_timestamp (now () - interval 1 days), ' yyyyMMdd ') AS INT)
GROUP BY calendar
 ORDER BY calendar DESC;")

si [ $strata -eq 0 ]; entonces
echo -e 'La tabla No se ha actualizado hoy, por favor espere' | mailx -s 'Alerta: Estado de actualización' -c dirección de correo electrónico -- dirección de correo electrónico
de lo contrario
echo -e El número de registros es $strata | mailx -s 'Alerta: Estado de actualización' -c dirección de correo electrónico -- dirección de correo electrónico  
fi

La salida de la variable será 0 o el número de registros en la tabla, y se enviará un correo electrónico en función de eso. Pero la parte else es la única que se envía independientemente del resultado.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Hay algunos problemas posibles con el script de shell que podrían estar causando este problema:

    1. La instrucción if está comprobando si $strata es igual a 0, pero $strata es en realidad una cadena que contiene tanto la fecha del calendario como el recuento de filas de la consulta. Para extraer solo el recuento de filas, se puede usar awk para dividir la cadena y recuperar la segunda columna:
    strata=$(impala connection string -q "SELECT calendar, COUNT(*) row_count FROM TABLE   
     WHERE calendar = CAST(from_unixtime(unix_timestamp(now() - interval 1 days), 'yyyyMMdd') AS INT)
    GROUP BY calendar
     ORDER BY calendar DESC;")
    
    row_count=$(echo "$strata" | awk '{print $2}')
    
    if [ $row_count -eq 0 ]; then
      echo -e 'La tabla NO se ha actualizado hoy, por favor espere' | mailx -s 'Alerta: Estado_de_actualización' -c dirección_de_correo_electrónico -- dirección_de_correo_electrónico
    else
      echo -e El número de registros es $row_count | mailx -s 'Alerta: Estado_de_actualización' -c dirección_de_correo_electrónico -- dirección_de_correo_electrónico 
    fi
    
    1. Otro problema podría ser la forma en que se llama el comando impala para ejecutar la consulta de Hive. Asegúrese de que la cadena de conexión y la sintaxis de la consulta sean correctas, y de que el comando devuelva un resultado válido. Se puede probar esto ejecutando directamente el comando en la shell sin el script:
    impala connection string -q "SELECT calendar, COUNT(*) row_count FROM TABLE   
     WHERE calendar = CAST(from_unixtime(unix_timestamp(now() - interval 1 days), 'yyyyMMdd') AS INT)
    GROUP BY calendar
     ORDER BY calendar DESC;"
    

    Si hay un error con el comando, puede ser necesario solucionar problemas más profundos en función del mensaje de error o revisar los registros de Hive.

    1. El script también podría encontrar errores al enviar el correo electrónico usando mailx. Asegúrese de que las direcciones de correo electrónico y la línea de asunto sean correctas, y de que el servidor de correo local esté configurado correctamente. Se puede probar esto enviando un correo electrónico de prueba desde la línea de comando usando mailx:
    echo "Correo electrónico de prueba" | mailx -s "Asunto de prueba" dirección_de_correo_electrónico
    

    Si el correo electrónico de prueba no llega, puede haber un problema con la configuración del servidor de correo o la configuración del firewall.

    En general, puede ser útil agregar algunas instrucciones de depuración al script (por ejemplo, echo "$strata", echo "row_count=$row_count") para comprobar los resultados intermedios y encontrar dónde se produce el problema.

Comments are closed.