Spark 数据框“.as”函数不会删除匹配案例中不存在的列 class

Spark dataframe ".as" function does not drop columns not present in matched case class

我对 Spark 的数据框 .as[] 函数有点困惑, 在文档中它说

returns a new Dataset where each record has been mapped to the specified type.

但是例如,如果我这样做:

case class Person(id: Int, name: String) 
case class NewPerson(id: Int)
val person1 = Person(1, "a")
val df = Seq(person1).toDF()
val ds = df.as[NewPerson]

我得到的 ds 数据集仍然会有 class Person 的两列 idname。我希望只有 class NewPersonid 列。

函数在这里做了什么?

实际上,as 方法仅更改数据的视图,而不是数据本身,如 documentation:

中所述

Note that as[] only changes the view of the data that is passed into typed operations, such as map(), and does not eagerly project away any columns that are not present in the specified class.

因此 as 不会删除您的案例中不存在的列 class,它只会创建您可以在类型化操作中使用的行视图。

添加到 Vincent Doba 的回答中,如果您使用案例 class A 创建类型为 Dataset[A] 的值 ds,那么您可以将其截断为您需要的字段以下:

val ds_clean: Dataset[A] = ds.map(identity)