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

我是否必须显式使用Dataframe的方法来利用Dataset的优化?[复制]

席言
2023-03-14

为了利用Dataset的优化,我是否必须显式使用Dataframe的方法(例如df.select(coll("name")、coll("age")等)或调用任何Dataset的方法-甚至类似RDD的方法(例如filtermap等)也允许优化?

共有1个答案

宋新知
2023-03-14

数据帧优化通常有三种风格:

  1. 钨存储器管理
  2. Catalyst查询优化
  3. 批发代码

钨存储器管理

定义RDD[myclass]时,spark对myclass没有真正的理解。这意味着通常每一行将包含该类的一个实例。

这有两个问题。

第一个是对象的大小。java对象有开销。例如,包含两个简单整数的case类。执行1000000个实例的序列并将其转换为RDD需要约26MB,而对dataset/dataframe执行相同操作需要约2MB。

此外,在数据集/数据帧中执行此操作时,该内存不是由垃圾收集管理的(它是由spark内部作为不安全内存管理的),因此GC性能的开销较小。

数据集具有与数据帧相同的内存管理优势。也就是说,在进行数据集操作时,将数据从内部(Row)数据结构转换为case类会产生性能开销。

Catalyst查询优化

使用dataframes函数时,spark知道您要做什么,有时可以将查询修改为更有效的等效查询。

例如,假设您正在执行以下操作:df.with列("a",light(1))。过滤器($"b"

基本上你是在检查如果(x

使用dataset操作时无法执行此类操作,因为spark对您正在执行的函数的内部结构一无所知。

批发代码

当spark知道您在做什么时,它实际上可以生成更高效的代码。在某些情况下,这可以将性能提高10倍。

这也不能在dataset函数上完成,因为spark不知道函数的内部结构。

 类似资料:
  • 问题内容: 最近,我将Swing应用程序转换为Webstart。这个过程非常简单,但是我发现在关闭所有窗口之后,应用程序的JVM没有终止。线程转储显示有两个非守护进程线程,特别是Swing的EDT,AWT和几个与Websart相关的线程。 实际使用的策略是,每个窗口在创建时都会增加一个计数器,在关闭时会减少一个。默认关闭操作为DISPOSE_ON_CLOSE。当计数器达到零时,我停止所有线程池并释

  • 我有一个结构,下面的运算符声明: 仅此运算符就可以将不可为null的结构隐式转换为int,但尝试隐式转换其可为null的对应结构仍会引发编译错误: 无法隐式转换类型

  • 本文向大家介绍使用store来优化React组件的方法,包括了使用store来优化React组件的方法的使用技巧和注意事项,需要的朋友参考一下 在使用 React 编写组件的时候,我们常常会碰到两个不同的组件之间需要共享状态情况,而通常的做法就是提升状态到父组件。但是这样做会有一个问题,就是尽管只有两个组件需要这个状态,但是因为把状态提到了父组件,那么在状态变化的时候,父组件以及其下面的所有子组

  • 问题内容: 示例:以下代码对JSON Spec有效吗? 还是应该始终使用以下语法?(如果是这样,为什么?) 我还没有在JSON规范中找到关于此的任何东西。尽管他们在示例中使用了围绕键的引号。 问题答案: 是的,您需要引号。这是为了使其更简单,并且避免了对javascript保留关键字必须使用另一种转义方法。

  • 问题内容: 我要问的是两种情况:技术上和风格上。 我的应用程序/守护进程可以在其中保存pidfile 吗? 这样做很不好吗? 我的需要是:我的守护程序在特定用户下运行,实现者必须在,chown和chgrp中的mkdir新目录中运行我的守护程序。似乎仅将pidfile保留在本地(对于守护程序)似乎更容易。 问题答案: 我不会将pidfile放在诸如的应用程序安装目录下。该目录可以是只读的,可以在机器

  • 本文向大家介绍C#检测DataSet是否为空的方法,包括了C#检测DataSet是否为空的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#检测DataSet是否为空的方法。分享给大家供大家参考。具体如下: 下面的代码片段通过判断DataSet的Table数量来判断DataSet是否为空 希望本文所述对大家的C#程序设计有所帮助。