所以我有以下情况:
我有一项服务,我在其中对数据框中的参数进行一些计算。例如,我正在执行describe()操作。我通过http-post(Array [String] + schema)获取参数,并通过sql上下文中的read.json函数读取它们。
我可以在一个具有10.000个参数的大数据帧中获得它,或者在只有一个参数的10,000个小数据帧中获得它。每个都有大约12.000行的时间戳。 最后,我需要收集数据帧以将其发送到不同的服务以进行进一步的计算。由于输入的创建方式,它更容易参数化。
但我发现,在许多小型数据帧上收集/转换为json比在一个巨大的数据帧上更昂贵。 对于大数据帧大约需要6秒钟而所有小型数据帧需要至少20秒。首先,这似乎并不那么重要,但我想在这些10.000参数输入中至少有3000个这样做。
为什么会这样?它似乎不是计算上的差异,而是收集它一次与多次的差异。
答案 0 :(得分:0)
当您调用collect()时,Spark必须提交作业并将数据发送到一个节点。
让我们考虑n个元素的10个DataFrame和10个元素的一个。
一个大集合() - >发送10n数据,创建一个执行计划和一个作业 10个DataFrames - > 10 * collect() - >发送10 * n数据,需要生成10个执行计划,并提交10个作业。
当然它还取决于硬件和网络,即如果你可以在一个节点上拥有小型DataFrame,那么可能比通过网络发送更快。