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.

Convertir una cadena de notación científica a número en Hive

Tengo una tabla desordenada en Cloudera con una columna de números en forma de cadena. Algunos números están en su forma de 8 dígitos, mientras que otros están en notación científica, como 91234567 vs 9.1234567E7. Cuando los números terminan en cero(s), hay menos decimales, por ejemplo, 9.12E7 para 91200000. ¿Cómo puedo convertirlos todos a su representación de 8 dígitos?

He intentado lo siguiente, sin éxito:

— Eliminar ‘E7’ y luego convertir la cadena en un decimal
,CASE WHEN m_number LIKE ‘%E7’
THEN CAST(REPLACE(m_number, ‘E7’, ”) AS DECIMAL(10,7)) * POW(10, 7)
ELSE m_number END AS m_clean

Devuelve: AnalysisException: Tipos de retorno incompatibles ‘DECIMAL(10,7)’ y ‘STRING’ de exprs ‘CAST(replace(m_number, ‘E7′, ”) AS DECIMAL(10,7))’ y ‘m_number’.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para convertir todos los números a su representación de 8 dígitos, puedes utilizar el siguiente código SQL:

    SELECT 
        CASE 
            -- Si el número contiene notación científica, elimina 'E7' y muélvelo por 10^7
            WHEN m_number LIKE '%E7' THEN CAST(REPLACE(m_number, 'E7', '') AS FLOAT) * POW(10, 7)
            -- Si el número termina en ceros, elimínalos y conviértelo a entero
            WHEN m_number LIKE '%0%' THEN CAST(REPLACE(m_number, '.', '') AS INTEGER)
            -- Si el número ya está en forma de 8 dígitos, devuélvelo tal cual
            ELSE CAST(m_number AS INTEGER)
        END AS m_clean
    FROM your_dirty_table;
    

    Este código primero verifica si el número está en notación científica con la condición LIKE '%E7'. Si es así, elimina ‘E7’ y lo multiplica por 10^7 para obtener el número completo. Si no está en notación científica, verifica si el número termina en cero(s) con la condición LIKE '%0%'. Si lo hace, elimina el punto decimal y los ceros, luego convierte el resultado en un entero. Si no está en notación científica ni termina en cero(s), ya está en su forma de 8 dígitos y solo necesita convertirse en un número entero.

    Este código debe manejar todos los casos de números sucios en tu tabla y devolver solo su representación de 8 dígitos.

Comments are closed.