将 Spark 数据帧写入多个 s3 存储桶

时间:2021-01-22 17:34:32

标签: apache-spark apache-spark-sql

我想将数据帧行保存在不同的 S3 存储桶中。让我们假设所有桶都存在。 我有一个简单的数据框:

<头>
租户 ID 收费
租户 1 10
租户 2 20

我想按tenantId对数据进行分区,但棘手的一点是每个租户数据都应该存储在不同的bucket中。 我可以将数据帧拆分为多个并独立存储每个数据帧,即对每个数据帧调用 save(...) 方法。但是,出于性能原因,这将是一个糟糕的解决方案。有没有更好的?

谢谢

2 个答案:

答案 0 :(得分:0)

请使用 partitionBy 子句作为 -

          df.write.
          partitionBy("tenantId").
          parquet("the root path")

它将创建名为“tenant1”和“tenant2”的不同文件夹,并将各自的行放入其中。

答案 1 :(得分:0)

不同的 s3 存储桶?怕不是。方式太复杂了。 spark DF 代码假定所有内容都在同一个文件系统中,例如 rename() 跨越它们;即使是零重命名提交者也都假定其目标存储桶相同。

如果您确实写入单个存储桶,则可以使用 aws s3 copy 命令将该单个存储桶中的数据复制到特定于租户的存储桶中。它将在 S3 中进行复制,因此比在本地进行复制要快 - 并且它允许您通过为每个租户生成不同的复制过程来同时复制不同租户的数据