在 PySpark 中,每当我在非常大的数据帧df
上排列一系列复杂操作,然后输入:
df.show(20)
Spark只会执行必要的操作(在部分数据集上)以快速返回20条记录以供显示。它不会对数据框df
的所有行执行操作,除非我强制它使用.collect()
执行此操作。
另一方面,在 Dask 中,当我做同样的事情时:
df.head(20)
Dask实际上会对整个数据帧执行操作(并且它会长时间搅拌),然后返回前20个记录。
Dask方法使得在非常大的数据集上快速迭代思想变得难以处理。有没有办法通过智能地做足以返回记录子集进行检查来使Dask更具响应性?
答案 0 :(得分:2)
以下命令
df.head(20)
仅从数据帧的第一个分区获取数据,假设它至少有20行。请注意,将需要第一个分区的整个。
确实需要做什么工作取决于df
的定义方式,例如:它可能依赖于一些复杂的groupby / shuffle操作的大量输入数据以及你使用的分区大小有多大
一般来说,(py)Spark针对类似SQL的工作流进行了大量优化,并且能够进行高级SQL规划以获得性能,而Dask中的优化往往是较低级别,在某些情况下会牺牲一些性能为了灵活性(您可以在Dask中实现复杂的工作流程,这些工作流程不可能或使用Spark非常难)。
说了这么多,关于你发现的内容的更多细节可能会让我们回答一些有关提高绩效的具体建议。