我是不是必须明确使用 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 的方法(例如 filtermap 等)也可以进行优化?

【问题讨论】:

【参考方案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)项目的所有传递依赖项的许可证?

Spark SQL - 如何将 DataFrame 写入文本文件?

java方法特点