我在Scala中使用Spark,我的聚合列是匿名的。有没有一种方便的方法来重命名数据集中的多个列?我考虑使用as
强制使用模式,但是键列是结构(由于groupBy
操作),我无法找到如何使用{定义case class
{1}}在其中。
我尝试按如下方式定义架构:
StructType
但是我遇到了编译错误:
val returnSchema = StructType(StructField("edge", StructType(StructField("src", IntegerType, true),
StructField("dst", IntegerType), true)),
StructField("count", LongType, true))
edge_count.as[returnSchema]
答案 0 :(得分:14)
最佳解决方案是明确命名列,例如
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
数据框。
答案 1 :(得分:1)
我最终使用alias
语句使用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)