Estoy usando Chispa en Scala y mi columnas de agregado son anónimos. Es allí una manera conveniente para cambiar el nombre de varias columnas de un conjunto de datos? Pensé acerca de la imposición de un esquema con as pero la clave de la columna es una estructura (debido a la groupBy operación), y yo no puedo averiguar cómo definir un case class con un StructType en ella.

Traté de definir un esquema como el siguiente:

val returnSchema = StructType(StructField("edge", StructType(StructField("src", IntegerType, true),
                                                             StructField("dst", IntegerType), true)), 
                              StructField("count", LongType, true))
edge_count.as[returnSchema]

pero tengo un error de compilación:

Message: <console>:74: error: overloaded method value apply with alternatives:
  (fields: Array[org.apache.spark.sql.types.StructField])org.apache.spark.sql.types.StructType <and>
  (fields: java.util.List[org.apache.spark.sql.types.StructField])org.apache.spark.sql.types.StructType <and>
  (fields: Seq[org.apache.spark.sql.types.StructField])org.apache.spark.sql.types.StructType
 cannot be applied to (org.apache.spark.sql.types.StructField, org.apache.spark.sql.types.StructField, Boolean)
       val returnSchema = StructType(StructField("edge", StructType(StructField("src", IntegerType, true),
  • Podrías mostrarnos el código? Así que tal vez pueda formular un mejor enfoque?
  • Fingir que se tiene un conjunto de datos con tres columnas. Grupo por los dos primeros, y el conde por la tercera. La clave es entonces una tupla. Estoy en la Chispa 1.6.2. Gracias @AlbertoBonsanto!
InformationsquelleAutor Emre | 2016-07-25

2 Comentarios

  1. 15

    La mejor solución es el nombre de las columnas de forma explícita, por ejemplo,

    df
      .groupBy('a, 'b)
      .agg(
        expr("count(*) as cnt"),
        expr("sum(x) as x"),
        expr("sum(y)").as("y")
      )

    Si usted está usando un conjunto de datos, usted tiene que proporcionar el tipo de las columnas, por ejemplo, expr("count(*) as cnt").as[Long].

    Puede utilizar el servicio de internet DSL directamente, pero a menudo me encuentro que para ser más detallado que simples expresiones SQL.

    Si quieres hacer la masa cambia el nombre, el uso de un Map y, a continuación, foldLeft el dataframe.

    • Esto me da un error de coincidencia de tipo; la entrada es un conjunto de datos.
    • Eso es porque expr() devuelve Column y usted necesita un TypedColumn en el conjunto de datos de la API. He actualizado la respuesta a mostrar un conjunto de datos de ejemplo.
  2. 1

    Terminé usando aliases con el select declaración; por ejemplo,

    ds.select($"key.src".as[Short], 
              $"key.dst".as[Short], 
              $"sum(count)".alias("count").as[Long])

    Primero tuve que usar printSchema para determinar la derivada de los nombres de columna:

    > ds.printSchema
    
    root
     |-- key: struct (nullable = false)
     |    |-- src: short (nullable = false)
     |    |-- dst: short (nullable = false)
     |-- sum(count): long (nullable = true)

Dejar respuesta

Please enter your comment!
Please enter your name here