当前位置: 首页 > 知识库问答 >
问题:

在spark dataframe中使用case类的好处[重复]

禄俊逸
2023-03-14

在spark dataframe中使用case类的优势是什么?我可以使用“inferschema”选项或定义Structtype字段来定义模式。我引用了“https://docs.scala-lang.org/tour/case-classes.html“但无法理解除了使用反射生成模式之外,使用case类还有什么好处。

共有1个答案

公孙阳文
2023-03-14

inferschema可能是一个代价高昂的操作,并且会不必要地延迟错误行为。考虑以下伪代码

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

现在在你的这段代码中,你已经有了一个假设,即字段名称String类型的,但它只是在你处理的后期表达并确保导致不幸的错误,以防它实际上不是String

现在如果你改做这个

val df = load.as[CaseClass]

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

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

如果您在REPL或Zeppelin中进行探索性操作,则模式推理非常方便,但不应在操作代码中使用。

编辑附录:我个人更喜欢使用案例类而不是模式,因为出于类似的健壮性原因,我更喜欢数据集API而不是数据框架API(即数据集行)。

 类似资料:
  • 我一直在对函数库和命名空间进行一些实验。我注意到您可以将命名空间中的函数声明为,尽管它不在类声明中: 水电站: cpp: 我理解类成员的概念,以及它们如何非常有用,但是在类外使用有什么特别的优势吗? 注意:我投了最后一票来结束这个问题(不能删除,因为有答案),因为引用为dup的引用虽然范围更广,但包含对的详细讨论。但我不确定它是否完全回答了我现在重新措辞的问题。

  • 我最近在我没有编写的代码中遇到了这个场景,虽然这种方法可能有一些设计上的好处,但我似乎无法从我自己的大脑中挤出这个原理。所以在我看起来很傻之前,我希望这里有一些反馈。 服务接口如下所示: 然后是一个向服务接口添加泛型引用的基类,其中T扩展了服务,但随后整个基类也实现了该接口。类似这样的事情: 你为什么要这么做?我注意到,在实践中,ServiceBase的扩展总是使用与正在声明的类名相同的类名T;所

  • 本文向大家介绍使用Dubbo的好处?相关面试题,主要包含被问及使用Dubbo的好处?时的应答技巧和注意事项,需要的朋友参考一下 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平

  • 问题内容: 好的,所以我的项目中有很多辅助函数,而我最初在一个名为Animate的类中具有这些函数。我想知道声明func vc类func有什么好处。 让我们以此作为示例类: 因此,我相信如果我有一个类的功能,我不必照此实例化该类。 如果我只是用func声明函数,它将是: 但是,如果我根本不将文件声明为类: 当我调用该函数时,它只是: 没有指示代码来自何处,可以在项目中的任何地方这样使用它。 这三种

  • 问题内容: 这个问题已经在这里有了答案 : 服务Flask应用程序是否需要WSGI服务器和HTTP服务器? (2个答案) 去年关闭。 我看到人们正在运行Nginx + Gunicorn + Flask之类的设置。 有人可以解释在烧瓶前使用Gunicorn有什么好处吗?为什么不只运行Flask?运行Gunicorn + Flask不会消耗更多资源吗?Gunicorn无法响应时可以重启Flask实例吗

  • 我有一张这样的桌子: 我想加上宽限期分数,条件是每个学生的总宽限期分数最多为6分,如果候选人在EC1中的28分和EC2中的27分两个科目中不及格,那么在加上宽限期EC1=30和EC2=30后,他是通过的。如果他在EC1中有25分,在EC2中有28分,那么需要的宽限期分数是5 2=7。因此,他是不及格的,没有宽限期分数,宽限期分数可以添加到最多两个科目。如果他在两个科目中不及格,那么他是不及格的,没