在火花数据框中使用案例类的好处[重复]

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

现在,在您的此代码中,您已经假设 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 列怎么办。我需要手动定义吗? 在某些时候可能是的,除非你可以从已经存在的东西中派生出来。也可以选择只定义一个包含您实际需要的字段的案例类,然后在加载时删除其余部分

以上是关于在火花数据框中使用案例类的好处[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在火花数据框中使用 for 循环添加新列

计算火花数据框中的字数

使用 scala 使用布尔运算折叠火花数据框中的列

检查数据框中的记录数是不是大于零而不使用计数火花

R - 如何使用 sparklyr 复制火花数据框中的行

如何从火花数据框中提取 csv 名称