在火花数据框中使用案例类的好处[重复]
Posted
技术标签:
【中文标题】在火花数据框中使用案例类的好处[重复]【英文标题】: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”但不明白除了使用反射生成架构之外,使用案例类还有什么优势。
【问题讨论】:
见Spark 2.0 Dataset vs DataFrame和Difference between DataSet API and DataFrame AP 【参考方案1】:inferschema 可能是一项昂贵的操作,并且会不必要地推迟错误行为。考虑下面的伪代码
val df = loadDFWithSchemaInference
//doing things that takes time
df.map(row => row.getAs[String]("fieldName")).//more stuff
现在,在您的此代码中,您已经假设 fieldName
是 String
类型,但它仅在您的处理后期表达并确保导致不幸的错误,以防它实际上不是 String
现在如果你愿意这样做
val df = load.as[CaseClass]
或
val df = load.option("schema", predefinedSchema)
fieldName
是String
的事实将是一个先决条件,因此您的代码将更加健壮且不易出错。
如果你在 REPL 中做探索性的事情,模式推断非常方便。 Zeppelin 但不应在操作代码中使用。
编辑附录:
我个人更喜欢使用案例类而不是模式,因为出于类似的稳健性原因,我更喜欢Dataset
API 而不是Dataframe
API(即Dataset[Row]
)。
【讨论】:
感谢 Dominic 的洞察力,因此定义 Structtype 类型的模式也有利于操作代码。如果架构包含 100 列怎么办。我需要手动定义吗? 在某些时候可能是的,除非你可以从已经存在的东西中派生出来。也可以选择只定义一个包含您实际需要的字段的案例类,然后在加载时删除其余部分以上是关于在火花数据框中使用案例类的好处[重复]的主要内容,如果未能解决你的问题,请参考以下文章