如何使Spark按分区写入并按列分组

时间:2019-01-15 01:11:58

标签: apache-spark

我有大约100Gb的数据要处理。数据的格式为:

| timestamp | social_profile_id | json_payload     |
|-----------|-------------------|------------------|
| 123       | 1                 | {"json":"stuff"} |
| 124       | 2                 | {"json":"stuff"} |
| 125       | 3                 | {"json":"stuff"} |

我正在尝试通过S3将此数据帧拆分到social_profile_id中的文件夹中。大约有430,000 social_profile_id个。

我已经毫无问题地将数据加载到了数据集中。但是,当我将其写出并尝试对其进行分区时,它将永远花费!这是我尝试过的:

messagesDS
      .write
      .partitionBy("socialProfileId")
      .mode(sparkSaveMode)

我真的不在乎工作结束时每个文件夹中有多少个文件。我的理论是,每个节点都可以按social_profile_id进行分组,然后写出到其各自的文件夹中,而无需进行随机播放或与其他节点通信。但是工作时间长并没有证明这一点。理想情况下,最终结果应类似于以下内容:

├── social_id_1 (only two partitions had id_1 data)
|   ├── partition1_data.parquet
|   └── partition3_data.parquet
├── social_id_2 (more partitions have this data in it)
|   ├── partition3_data.parquet
|   └── partition4_data.parquet
|   ├── etc.
├── social_id_3
|   ├── partition2_data.parquet
|   └── partition4_data.parquet
|   ├── etc.
├── etc.

我尝试几次增加计算资源,既增加实例大小又增加实例数。我从火花UI所看到的是写入操作占用的大部分时间。似乎所有执行程序都在使用中,但是执行时间却非常荒谬(例如花费3-5个小时来编写〜150Mb),将不胜感激!抱歉,如果我混淆了一些火花术语。

0 个答案:

没有答案