Spark in Scalaを使用していて、集計された列は匿名です。データセットから複数の列の名前を変更する便利な方法はありますか? as
を含むスキーマですが、キー列は構造体(groupBy
操作のため)であり、case class
をStructType
初期化。
次のようにスキーマを定義してみました。
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),
alias
esを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)
最善の解決策は、列に明示的に名前を付けることです。たとえば、
_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
します。