scala - 如何从 DataFrame 中选择案例类中存在的列

标签 scala dataframe apache-spark case-class

给定一个包含列“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 )

我只想选择案例类中的 idlast 列。换句话说,我想通过使用案例类来获得此输出 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/

相关文章:

apache-spark - 为什么在完成作业和关闭 Spark 之间会发生磁盘繁忙尖峰?

scala - 错误 : org. apache.spark.sql.AnalysisException:无法推断 CSV 的架构

scala 隐式 par 没有任何进展

python-3.x - Python从数据帧中的float64获取十进制数

dataframe - 从 Spark 中的数据框列值中删除空格

python - 如何找到组内值之间的最小差异

scala - 将多个文件从一个文件夹复制到另一个文件夹

scala - 从 playframework 2.0 向网络服务发出 GET 请求

scala - 使用模式将带有 Spark 的 AVRO 消息转换为 DataFrame

apache-spark - 分区如何在Spark中工作?