如何 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 列,即 id
和 last
。换句话说,我想通过使用 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|
+---+-----+
给定一个包含列 "id", "first", "last", "year"
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 列,即 id
和 last
。换句话说,我想通过使用 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|
+---+-----+