如何 select 来自 DataFrame 的 类 情况下存在的列

How to select columns that exist in case classes from DataFrame

给定一个包含列 "id", "first", "last", "year"

的 spark DataFrame
val df=sc.parallelize(Seq(
  (1, "John", "Doe", 1986),
  (2, "Ive", "Fish", 1990),
  (4, "John", "Wayne", 1995)
)).toDF("id", "first", "last", "year")

和案例class

case class IdAndLastName(
id: Int,
last:String )

在 class 的情况下,我只想 select 列,即 idlast。换句话说,我想通过使用 case class 得到这个输出 df.select("id","last")。我正在避免对属性进行硬编码。你能帮我一下我怎样才能以一种紧凑的方式实现这一目标吗?

您可以为案例 class 显式创建编码器(通常这会隐式发生 here)。然后你可以从编码器中获取字段名称并在 select 语句中使用它们:

val fieldnames = Encoders.product[IdAndLastName].schema.fieldNames
df.select(fieldnames.head, fieldnames.tail:_*).show()

输出:

+---+-----+
| id| last|
+---+-----+
|  1|  Doe|
|  2| Fish|
|  4|Wayne|
+---+-----+