在数据集上使用column调用的成本是多少?



我正在与RDD合作的几个项目之后,凝视着与数据集合作。我正在使用Java进行开发。

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

我的问题是我打电话给column时到底发生了什么?有绩效罚款吗?我应该尝试尽可能少的withColumn调用还是无关紧要?

背负的问题:当我调用任何其他行/列创建功能(例如爆炸或枢轴)时,是否有任何性能惩罚?

与数据框相互作用的各种函数的性能都足够快,以至于您永远不会遇到问题(或真正注意到它们)。

,如果您了解Spark如何执行您在驱动程序中定义的过渡,这将更有意义。当您调用各种转换功能时( withColumn select ,等)Spark实际上不会立即做任何事情。它只是注册您要在执行计划中运行的操作。在调用 Action 之前,Spark不会启动数据计算,通常是为了获取结果或写出数据。

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

通常会确定驾驶员性能的事情是:

  1. 有多少个广泛的转换(执行者之间的数据混音)在那里以及正在改组多少数据
  2. 我有任何昂贵的转换功能

有关爆炸和枢轴的额外问题:

  • 爆炸创建了新的行,但是一个狭窄的转换。它可以更改到位的分区,而无需在执行者之间移动数据。这意味着表现相对便宜。如果您有很大的阵列,则有一个例外,如拉斐尔在评论中指出的那样。
  • Pivot需要一个集体操作,这是一个广泛的转换。它必须将每个执行人的数据发送给其他所有执行人,以确保给定密钥的所有数据都在同一分区中。由于所需的所有额外的网络流量,这是一个昂贵的操作。

最新更新