Odi*_*ura 1 apache-spark pyspark
我有一个有 2 亿行的 DF。我无法将此 DF 分组,必须将其拆分为 8 个较小的 DF(每个 DF 大约 3000 万行)。我尝试过这种方法但没有成功。如果不缓存 DF,则分割的 DF 的计数与较大的 DF 不匹配。如果我使用缓存,我的磁盘空间就会不足(我的配置是 64GB RAM 和 512 SSD)。
考虑到这一点,我考虑了以下方法:
以以下 DF 为例:
+------+--------+
| val1 | val2 |
+------+--------+
|Paul | 1.5 |
|Bostap| 1 |
|Anna | 3 |
|Louis | 4 |
|Jack | 2.5 |
|Rick | 0 |
|Grimes| null|
|Harv | 2 |
|Johnny| 2 |
|John | 1 |
|Neo | 5 |
|Billy | null|
|James | 2.5 |
|Euler | null|
+------+--------+
Run Code Online (Sandbox Code Playgroud)
DF 有 14 行,我想使用 window 创建以下 DF:
+------+--------+----+
| val1 | val2 | sep|
+------+--------+----+
|Paul | 1.5 |1 |
|Bostap| 1 |1 |
|Anna | 3 |1 |
|Louis | 4 |1 |
|Jack | 2.5 |1 |
|Rick | 0 |1 |
|Grimes| null|1 |
|Harv | 2 |2 |
|Johnny| 2 |2 |
|John | 1 |2 |
|Neo | 5 |2 |
|Billy | null|2 |
|James | 2.5 |2 |
|Euler | null|2 |
+------+--------+----+
Run Code Online (Sandbox Code Playgroud)
考虑到最后一个 DF,我将使用过滤器按 sep 进行过滤。我的疑问是:如何使用窗口函数生成最后一个 DF 的列 sep?
由于您将数据帧随机分为 8 个部分,因此可以使用randomSplit():
split_weights = [1.0] * 8
splits = df.randomSplit(split_weights)
for df_split in splits:
# do what you want with the smaller df_split
Run Code Online (Sandbox Code Playgroud)
请注意,这不能确保每个 中的记录数量相同df_split。可能会有一些波动,但对于 2 亿条记录来说,可以忽略不计。