【问题标题】:Benefit of using case class in spark dataframe [duplicate]在火花数据框中使用案例类的好处[重复]
【发布时间】:2018-10-25 08:37:36
【问题描述】:

在 spark dataframe 中使用 case class 有什么好处?我可以使用“inferschema”选项定义架构或定义 Structtype 字段。 我提到 “https://docs.scala-lang.org/tour/case-classes.html”但不明白除了使用反射生成架构之外,使用案例类还有什么优势。

【问题讨论】:

标签: scala apache-spark case-class


【解决方案1】:

inferschema 可能是一项昂贵的操作,并且会不必要地推迟错误行为。考虑下面的伪代码

val df = loadDFWithSchemaInference
//doing things that takes time
df.map(row => row.getAs[String]("fieldName")).//more stuff

现在,在您的此代码中,您已经假设 fieldNameString 类型,但它仅在您的处理后期表达并确保导致不幸的错误,以防它实际上不是 String

现在如果你愿意这样做

val df = load.as[CaseClass]

val df = load.option("schema", predefinedSchema)

fieldNameString 的事实将是一个先决条件,因此您的代码将更加健壮且不易出错。

如果你在 REPL 中做探索性的事情,模式推断非常方便。 Zeppelin 但不应在操作代码中使用。

编辑附录: 我个人更喜欢使用案例类而不是模式,因为出于类似的稳健性原因,我更喜欢Dataset API 而不是Dataframe API(即Dataset[Row])。

【讨论】:

  • 感谢 Dominic 的洞察力,因此定义 Structtype 类型的模式也有利于操作代码。如果架构包含 100 列怎么办。我需要手动定义吗?
  • 在某些时候可能是的,除非你可以从已经存在的东西中派生出来。也可以选择只定义一个包含您实际需要的字段的案例类,然后在加载时删除其余部分
猜你喜欢
  • 2019-08-02
  • 2019-03-19
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 2019-07-16
  • 2017-10-30
相关资源
最近更新 更多