web-dev-qa-db-ja.com

集計列に名前を付ける方法は?

Spark in Scalaを使用していて、集計された列は匿名です。データセットから複数の列の名前を変更する便利な方法はありますか? asを含むスキーマですが、キー列は構造体(groupBy操作のため)であり、case classStructType 初期化。

次のようにスキーマを定義してみました。

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

しかし、コンパイルエラーが発生しました:

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

aliasesをselectステートメントで使用することになりました。例えば。、

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

最初に、派生列名を決定するためにprintSchemaを使用する必要がありました。

> ds.printSchema

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

最善の解決策は、列に明示的に名前を付けることです。たとえば、

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

データセットを使用している場合は、列のタイプを提供する必要があります(例:expr("count(*) as cnt").as[Long])。

DSLを直接使用できますが、単純なSQL式よりも冗長であることがよくあります。

一括で名前を変更する場合は、Mapを使用してからデータフレームをfoldLeftします。

18
Sim