webentwicklung-frage-antwort-db.com.de

Wie benenne ich Aggregatspalten?

Ich verwende Spark in Scala und meine aggregierten Spalten sind anonym. Gibt es eine praktische Möglichkeit, mehrere Spalten aus einem Datensatz umzubenennen? Ich habe überlegt, ein Schema mit as zu erzwingen, aber die Schlüsselspalte ist eine Struktur (aufgrund der groupBy-Operation), und ich kann nicht herausfinden, wie ein case class mit einer StructType darin definiert wird.

Ich habe versucht, ein Schema wie folgt zu definieren:

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

aber ich habe einen Fehler beim Kompilieren bekommen:

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),
12
Emre

Am Ende habe ich aliases mit der select-Anweisung verwendet. z.B.,

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

Zuerst musste ich printSchema verwenden, um die abgeleiteten Spaltennamen zu ermitteln:

> ds.printSchema

root
 |-- key: struct (nullable = false)
 |    |-- src: short (nullable = false)
 |    |-- dst: short (nullable = false)
 |-- sum(count): long (nullable = true)
0
Emre

Die beste Lösung ist, Ihre Spalten explizit zu benennen, z.

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

Wenn Sie ein Dataset verwenden, müssen Sie den Typ Ihrer Spalten angeben, z. B. expr("count(*) as cnt").as[Long].

Sie können das DSL direkt verwenden, aber ich finde es oft ausführlicher als einfache SQL-Ausdrücke.

Wenn Sie Massenumbenennungen durchführen möchten, verwenden Sie eine Map und dann foldLeft den Datenrahmen.

14
Sim