Apache chispa El valor de entrada de los gastos supera el valor máximo

en nuestra aplicación usamos abajo expresión

df.selectExpr((col_x*8*6)/(1024 * 1024 * 1024 * 60 * 15))

cuando utilizamos arriba obtenemos valor nulo debido a esta parte excede el valor máximo entero 1024 * 1024 * 1024 * 60 * 15

así que cambiamos sobre la expresión como abajo y su trabajo

df.selectExpr((col_x*8*6)/(1024.0 * 1024.0 * 1024.0 * 60.0 * 15.0))

problema es que tenemos miles de expresiones existentes así que hay cualquier mango de configuración que este entero supera el valor máximo

Pregunta hecha hace 3 años, 4 meses, 27 días - Por scriptsorcererf493


3 Respuestas:

  • Trate de lanzar el colx a largo o doble tipo de datos dentro de su expresion.

    Respondida el Dec 18, 2020 a las 11:18 - por bytebard

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando se debe a que el cálculo de la expresión excede el valor máximo entero, lo cual resulta en un valor nulo en Apache Spark.

    La solución que has implementado, al cambiar los enteros por decimales en la expresión, es correcta para evitar este problema. Sin embargo, si tienes miles de expresiones existentes y deseas evitar tener que modificar cada una manualmente, puedes considerar configurar la precisión predeterminada de los cálculos en Apache Spark a decimales en lugar de enteros.

    Esto se puede lograr utilizando la SparkSession y configurando la propiedad "spark.sql.legacy.decimalOperations.enabled" en true. Esta propiedad permite que las operaciones matemáticas se realicen utilizando valores decimales en lugar de enteros, evitando así problemas con valores máximos.

    java
    // Habilitar operaciones decimales en SparkSession
    spark.conf.set("spark.sql.legacy.decimalOperations.enabled", "true")
    

    Al configurar esta propiedad, todas las operaciones matemáticas en Spark SQL se realizarán utilizando valores decimales en lugar de enteros de forma predeterminada, lo que debería resolver el problema que estás experimentando con las expresiones que exceden el valor máximo entero.

    Espero que esta solución te ayude a manejar el problema de forma más generalizada en lugar de tener que modificar cada expresión manualmente.

    Respondida el Dec 19, 2020 a las 11:19 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para manejar situaciones en las que los valores enteros superan el valor máximo en Apache Spark, puedes utilizar el tipo de datos DecimalType. Este tipo de datos te permite especificar la precisión y escala de los valores decimales, lo que te permite trabajar con números muy grandes o muy pequeños.

    Para utilizar el tipo de datos DecimalType, puedes utilizar la función lit() para crear un literal decimal y luego utilizar el operador cast() para convertir una columna a ese tipo de datos. Por ejemplo:

    
    import pyspark.sql.functions as F
    
    

    Crear un literal decimal

    decimal_literal = F.lit(Decimal(1024 1024 1024 60 15))

    Convertir una columna a tipo de datos decimal

    df = df.withColumn("scaled_col", F.cast(df["col_x"], DecimalType(38, 18)))

    Realizar cálculos utilizando valores decimales

    df.selectExpr("(scaled_col 8 6) / decimal_literal").show()

    Esto debería permitirte realizar cálculos con números muy grandes sin perder precisión debido a la superación del valor máximo entero.

    Nota: El tipo de datos DecimalType no está disponible en todas las versiones de Apache Spark. Consulta la documentación de tu versión específica de Spark para obtener más información.

    Respondida el Dec 19, 2020 a las 11:30 - por Gemini

    Votos positivos: 0 | Votos negativos: 0