Cómo pasar sql. Dataframe como argumento a una función en Scala

Estoy tratando de pasar un Dataframe a una función en la que estoy agregando más columnas en él Actualmente el df tiene pocas columnas en las que necesito filtrar dentro de la función

Cuando trato de pasar el marco de datos, se muestra como Found sql. Dataframe - Dataframe requerido.

val myData = sparksession.sql(" select query")

getFilteredDF(myData)

def getFilteredDF(myData:DataFrame): DataFrame={
     // adding few more columns and checks to df with .withcolumn()
}

¿Tengo que pasar como Dataframe o hay algún otro tipo que necesite dar para pasarlo a la función?

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


3 Respuestas:

  • import org.apache.spark.sql.functions.lit
    import org.apache.spark.sql.{DataFrame, SparkSession}
    import spark.implicits._
    
    def fAddCol(df: DataFrame): DataFrame = {
        df.withColumn("colOne", lit(1))
          .withColumn("colTwo", lit("test"))
    }
    
    val source = Seq(
        ("SUP_ID1", "Desc1"),
        ("SUP_ID2", "Desc2"),
        ("SUP_ID3", "Desc3"),
        ("SUP_ID4", "Desc4"),
        ("SUP_ID5", "Desc5"),
        ("SUP_ID6", "Desc6"),
        ("SUP_ID7", "Desc7")
    ).toDF("Key", "Desc")
    
    
    val res = fAddCol(source)
    
    res.printSchema()
    //  root
    //  |-- Key: string (nullable = true)
    //  |-- Desc: string (nullable = true)
    //  |-- colOne: integer (nullable = false)
    //  |-- colTwo: string (nullable = false)
    
    res.show(false)
    //  +-------+-----+------+------+
    //  |Key    |Desc |colOne|colTwo|
    //  +-------+-----+------+------+
    //  |SUP_ID1|Desc1|1     |test  |
    //  |SUP_ID2|Desc2|1     |test  |
    //  |SUP_ID3|Desc3|1     |test  |
    //  |SUP_ID4|Desc4|1     |test  |
    //  |SUP_ID5|Desc5|1     |test  |
    //  |SUP_ID6|Desc6|1     |test  |
    //  |SUP_ID7|Desc7|1     |test  |
    //  +-------+-----+------+------+
    

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

    Votos positivos: 0 | Votos negativos: 0

  • En Scala, cuando trabajas con Dataframes en Spark, puedes pasar un objeto DataFrame como argumento a una función sin ningún problema. En tu caso, estás pasando un objeto sql.DataFrame, que es un tipo específico de DataFrame que se utiliza cuando realizas operaciones con SQL en Spark.

    La razón por la que estás viendo el error "Found sql.DataFrame, required DataFrame" es probablemente porque Spark necesita que el tipo de DataFrame coincida exactamente en la declaración de la función y en la llamada a la función.

    Para corregir este problema, asegúrate de que estás importando las clases y métodos necesarios al principio de tu archivo Scala. Revisa que estás importando correctamente las clases de DataFrame:

    scala
    import org.apache.spark.sql.DataFrame
    

    Además, si estás utilizando un objeto sql.DataFrame en tu código, asegúrate de que estás convirtiendo correctamente ese objeto en un DataFrame de Spark antes de llamar a la función getFilteredDF. Puedes hacerlo de la siguiente manera:

    scala
    val myData = sparksession.sql("select query").toDF()
    getFilteredDF(myData)
    
    def getFilteredDF(myData: DataFrame): DataFrame = {
      // adding few more columns and checks to df with .withColumn()
    }
    

    Al convertir el objeto sql.DataFrame a un DataFrame de Spark utilizando el método toDF() se asegurará de que estés pasando el tipo de DataFrame correcto a la función y debería resolver el error que estás experimentando.

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

    Votos positivos: 0 | Votos negativos: 0

  • Para pasar un DataFrame de Spark como argumento a una función en Scala, debes especificar el tipo de DataFrame en la definición de la función.

    Aquí tienes un ejemplo corregido:

    scala
    import org.apache.spark.sql.DataFrame
    
    val myData = sparkSession.sql("select query")
    
    def getFilteredDF(myData: DataFrame): DataFrame = {
      // añadiendo más columnas y comprobaciones al df con .withColumn()
    }
    
    getFilteredDF(myData)
    

    En este ejemplo, hemos importado DataFrame desde org.apache.spark.sql y especificado el tipo de argumento myData como DataFrame en la definición de la función getFilteredDF. Esto garantiza que la función espera un DataFrame como argumento.

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

    Votos positivos: 0 | Votos negativos: 0