给定一个包含列“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")
和案例类别
case class IdAndLastName(
id: Int,
last:String )
我只想选择案例类中的 id
和 last
列。换句话说,我想通过使用案例类来获得此输出 df.select("id","last")
。我避免对属性进行硬编码。您能否帮助我如何以紧凑的方式实现这一目标。
最佳答案
您可以为案例类显式创建一个编码器(通常这会隐式发生 here )。然后您可以从编码器获取字段名称并在 select 语句中使用它们:
val fieldnames = Encoders.product[IdAndLastName].schema.fieldNames
df.select(fieldnames.head, fieldnames.tail:_*).show()
输出:
+---+-----+
| id| last|
+---+-----+
| 1| Doe|
| 2| Fish|
| 4|Wayne|
+---+-----+
关于scala - 如何从 DataFrame 中选择案例类中存在的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69108849/