gpt4 book ai didi

java - 在数据集上调用 withColumn 的成本是多少

转载 作者:行者123 更新时间:2023-12-02 11:52:50 25 4
gpt4 key购买 nike

在我使用 RDD 进行了几个项目之后,我开始使用数据集。我正在使用 Java 进行开发。

据我了解,列是不可变的 - 列没有映射函数,映射列的标准方法是使用 withColumn 添加列。

我的问题是,当我调用 withColumn 时到底发生了什么?有性能损失吗?我应该尝试尽可能少地进行 withColumn 调用,还是没有关系?

附带问题:当我调用任何其他行/列创建函数(例如explode 或pivot)时,是否会有性能损失?

最佳答案

与 DataFrame 交互的各种函数的性能都足够快,您永远不会遇到问题(或真正注意到它们)。

如果您了解 Spark 如何执行您在驱动程序中定义的转换,这将更有意义。当您调用各种转换函数(withColumnselect 等)时,Spark 实际上并没有立即执行任何操作。它只是注册您想要在其执行计划中运行的操作。在您调用操作(通常是为了获取结果或写出数据)之前,Spark 不会开始对您的数据进行计算。

了解您想要运行的所有操作允许 Spark 在实际运行之前对执行计划进行优化。例如,假设您使用 withColumn 创建一个新列,但在将数据写入文件之前删除该列。 Spark 知道它实际上永远不需要计算该列。

通常决定驱动程序性能的因素是:

  1. 有多少个宽转换(执行程序之间的数据洗牌)以及有多少数据正在洗牌
  2. 我有昂贵的转换函数吗

关于爆炸和旋转的额外问题:

  • 分解会创建新行,但它是一种狭窄的转换。它可以就地更改分区,而无需在执行程序之间移动数据。这意味着它的执行成本相对较低。正如拉斐尔在评论中指出的那样,如果您有非常大的数组,并且正在爆炸,则有一个异常(exception)。
  • Pivot 需要 groupBy 操作,这是一个广泛的转换。它必须将数据从每个执行器发送到每个其他执行器,以确保给定键的所有数据都位于同一分区中。这是一项昂贵的操作,因为需要额外的网络流量。

关于java - 在数据集上调用 withColumn 的成本是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47773637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com