El uso de Chispa 2.1 (en Databricks), tengo una tabla que tiene una columna de tipo String como resultado de una importación de un .Archivo CSV. En una consulta de selección en contra de esa mesa, yo estoy tratando de convertir el valor de la columna en un Entero antes de usar el valor de la columna en una operación matemática. He sido incapaz de encontrar la Chispa de SQL «función» para hacer esto.

A continuación es un ejemplo de la SQL. «TO_NUMBER» no está trabajando en cualquiera de las dos Cadenas; Sum_GN_POP o Count1:

SELECT name AS geohashPrefix3, TO_NUMBER(Sum_GN_POP) AS totalPopulation, TO_NUMBER(Count1) AS landMass
    FROM wayne_geohash3
   WHERE (LENGTH(name) = 3)

Y sería de gran ayuda si pudiera encontrar la documentación de este. Yo quiero hacer otro tipo de conversiones (o moldes) con otros tipos, también. Cualquier orientación sobre uno o ambos de esta es muy apreciado.

  • Yo sugeriría hacer uso de un archivo udf para hacer el análisis….

4 Comentarios

  1. 10

    Que usted puede conseguir Integer de la csv archivo utilizando la opción inferSchema como este :

    val df = spark.read.option("inferSchema", true).csv("file-location")

    Que se dice : el inferSchema opción de hacer cometer errores a veces y poner el tipo de String. si es así, puede utilizar el cast operador en Column

    Dataframe/Conjunto De Datos De Aplicación :

    val df2 = df.withColumn("Count1", $"Count1" cast "Int" as "landMass").withColumn("Count1", $"Sum_GN_POP" cast "Int" as "totalPopulation")

    SQL Implementación :

    SELECT name AS geohashPrefix3, CAST(Sum_GN_POP as INT) AS totalPopulation, CAST(Count1 AS INT) AS landMass
        FROM wayne_geohash3
       WHERE (LENGTH(name) = 3)
    • No estoy listo para hacer eso todavía. Su respuesta mientras correcta es incompleta. Mi respuesta es lo que originalmente estaba tratando de encontrar. Todavía soy incapaz de decir si mi respuesta es realmente un molde o algo más.
  2. 3

    Me gustaría que el uso de una UDF porque de Spark cast no captura variable de desbordamiento:

    val parseInt = udf((s:String) => scala.util.Try{Some(s.toInt)}.getOrElse(None))
    
    Seq("100", "10000000000", "1x0")
      .toDF("i")
      .select(
        $"i" cast "int" as "casted_result",
        parseInt($"i") as "udf_result"
      ).show
    
    +-------------+----------+
    |casted_result|udf_result|
    +-------------+----------+
    |          100|       100|
    |   1410065408|      null|
    |         null|      null|
    +-------------+----------+
    • Esto es demasiado apagado la Chispa de SQL camino por un simple String a Int conversión en un bote de consulta en la que ya conocemos el valor de la columna ha sido limitada. Sin embargo, su respuesta es muy valioso para cuando me hace falta ese nivel de protección.
  3. 2

    Resumen:

    Apache La chispa del SQL tiene compatibilidad parcial con Apache Hive. Así, la mayoría de SQL que puede ser escrito en la Colmena puede ser escrito en la Chispa de la SQL.

    Detalle:

    Para convertir una CADENA a un determinado tipo numérico como INT, un yeso puede ser utilizado. El elenco consiste en envolver el objetivo con el paréntesis y el anterior paréntesis con el tipo al que va a ser cambiado. Por ejemplo, el reparto podría tener este aspecto:

    INT(someStringValue)

    Así, para hacer el SQL en el original publicado cuestión de trabajo, necesita ser cambiado para parecerse a esto (en sustitución de la original de una función denominada «TO_NUMBER» con «INT»):

    SELECT name AS geohashPrefix3, INT(Sum_GN_POP) AS totalPopulation, INT(Count1) AS landMass
      FROM wayne_geohash3
     WHERE (LENGTH(name) = 3)
  4. 1

    Haroun la respuesta acerca de la fundición en Sql que funciona para mí. Pero aviso que, si el número en la cadena es más grande que integer, el resultado será null. Para números más grandes que integer (long o bigint), el yeso debe ser como:

    CAST(Sum_GN_POP as BIGINT)

Dejar respuesta

Please enter your comment!
Please enter your name here