将大数据框拆分为小数据框 Spark

Odi*_*ura 1 apache-spark pyspark

我有一个有 2 亿行的 DF。我无法将此 DF 分组,必须将其拆分为 8 个较小的 DF(每个 DF 大约 3000 万行)。我尝试过这种方法但没有成功。如果不缓存 DF,则分割的 DF 的计数与较大的 DF 不匹配。如果我使用缓存,我的磁盘空间就会不足(我的配置是 64GB RAM 和 512 SSD)。

考虑到这一点,我考虑了以下方法:

  1. 加载整个 DF
  2. 给这个 DF 提供 8 个随机数
  3. 将随机数均匀分布在 DF 中

以以下 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?

vig*_*nah 5

由于您将数据帧随机分为 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 亿条记录来说,可以忽略不计。