考虑一下,我有一个 100 GB 的 csv 文件,我需要创建一个排名列,让我们说基于“customer_spends_in_dollar”列的“排名”。
df = spark.read.csv('file.csv')
(
df
.withColumn(
'rank',
F.rank().over(
Window().orderBy('customer_spends_in_dollar')
)
)
).display()
规格:8 GB 驱动程序、8 GB 2 个工作节点、每个 2 个核心
想法存在,对于这个荒谬的不。需要强调的是,不可能将整个数据加载到单个节点(驱动程序)上。
上述转换的第一个操作是对整个数据帧进行排序,现在根据我的理解,对工作节点上的各个分区文件(部分文件)进行排序,不会完全对数据进行排序,它只会对一部分数据进行排序,并且此外,它需要立即完全排序,然后我看到一个问题,如何在驱动程序节点上组装这些数据,因为它无法放入内存中。这就是我的理解停止的地方。
当然,但是 Spark 能够做到以上的事情,我已经检查过,这只是一个长期的工作。但怎么办?
如果没有
partition
值,您将看到 sort
/ order by
将数据移动到单个分区。 IE。完整的数据框在那里排序。以及所有随之而来的 OOM 问题等。
Spark的基本原则是并行性,但它需要根据某些列值进行分组或分区来分布数据。如果不是这种情况,那就是发生的情况,而不是首先进行本地(分区)排序。