我是不是必须明确使用 Dataframe 的方法才能利用 Dataset 的优化? [复制]
Posted
技术标签:
【中文标题】我是不是必须明确使用 Dataframe 的方法才能利用 Dataset 的优化? [复制]【英文标题】:Do I have to explicitly use Dataframe's methods to take advantage of Dataset's optimization? [duplicate]我是否必须明确使用 Dataframe 的方法才能利用 Dataset 的优化? [复制] 【发布时间】:2017-02-23 06:28:09 【问题描述】:要利用Dataset
的优化,我是否必须显式使用Dataframe's
方法(例如df.select(col("name"), col("age")
等)或调用任何数据集的方法 - 即使是类似 RDD 的方法(例如 filter
、map
等)也可以进行优化?
【问题讨论】:
【参考方案1】:Dataframe 优化通常分为 3 种风格:
-
Tungsten 内存管理
催化剂查询优化
全阶段代码生成
钨合金内存管理
在定义 RDD[myclass] 时,spark 并没有真正理解 myclass 是什么。这意味着通常每一行都将包含该类的一个实例。
这有两个问题。
首先是对象的大小。 java 对象有开销。例如,一个包含两个简单整数的案例类。执行 1000000 个实例的序列并将其转换为 RDD 大约需要 26MB,而对数据集/数据帧执行相同操作需要大约 2MB。
此外,当在数据集/数据帧中完成时,此内存不由垃圾收集管理(它在内部由 spark 管理为不安全内存),因此在 GC 性能方面的开销较小。
Dataset 享有与 DataFrame 相同的内存管理优势。也就是说,在进行数据集操作时,将数据从内部(行)数据结构转换为案例类会产生性能开销。
催化剂查询优化
使用数据帧函数时,spark 知道您要做什么,有时可以将您的查询修改为更有效的等效查询。
例如,假设您正在执行以下操作: df.withColumn("a",lit(1)).filter($"b"
基本上,您正在检查是否 (x
在使用数据集操作时无法执行此类操作,因为 spark 不知道您正在执行的函数的内部结构。
全阶段代码生成
当 spark 知道你在做什么时,它实际上可以生成更高效的代码。在某些情况下,这可以将性能提高 10 倍。
这也不能在数据集函数上完成,因为 spark 不知道函数的内部结构。
【讨论】:
以上是关于我是不是必须明确使用 Dataframe 的方法才能利用 Dataset 的优化? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
TypeError:int() 参数必须是字符串、类似字节的对象或数字,而不是“DataFrame”
DataFrame 无法迭代:出现以下错误:元组索引必须是整数或切片,而不是 str
DataFrame 列比较引发 ValueError:Series 的真值不明确。 [复制]
我是不是必须明确检查/履行(Java)项目的所有传递依赖项的许可证?