Scala 按列值对Spark数据帧进行分区,并将分区后的数据并行写入多个S3存储桶

Scala 按列值对Spark数据帧进行分区,并将分区后的数据并行写入多个S3存储桶,scala,apache-spark,amazon-s3,Scala,Apache Spark,Amazon S3,假设Spark dataframe的形状如下: Customers(id: Long, fname: String, lname: String) [1, Fname1, Lname1] [2, Fname2, Lname2] [3, Fname3, Lname3] [4, Fname4, Lname4] 我想根据id对数据帧进行分区,并将分区后的数据帧上载到AWS S3 bucket中,这些bucket的名称包括id,例如example customer bucket-{id}。结果,[1

假设Spark dataframe的形状如下:

Customers(id: Long, fname: String, lname: String)

[1, Fname1, Lname1]
[2, Fname2, Lname2]
[3, Fname3, Lname3]
[4, Fname4, Lname4]
我想根据id对数据帧进行分区,并将分区后的数据帧上载到AWS S3 bucket中,这些bucket的名称包括id,例如
example customer bucket-{id}
。结果,
[1,Fname1,Lname1]
被上传到bucket
example-customer-bucket-1
中,依此类推


是否有Scala/Spark函数可以同时处理分区和写操作?或者我必须在循环中迭代数据吗?

在S3中将不同的客户放在不同的存储桶中听起来像是一场架构灾难;我真的不认为这是你真正想做的?你能详细说明你为什么要这么做吗?谢谢你的评论。我们需要与每个客户共享客户数据,每个客户都拥有一个S3 bucket,其中
id
是bucket名称的一部分。我们不想与客户B共享关于客户A的数据,因此我需要根据id对框架进行分区;您在现实世界中共享一行客户数据还是多行(例如,来自事务数据)时遇到问题?数据框可以包含多个具有相同id的行。在这种情况下,我们将在一个文件中与具有相同id的客户共享所有具有相同id的行。好的,我要做的是在输出时将客户id上的数据分区到单个存储桶。语法类似于dataframe.write.partitionBy(“id”).parquet(“完整路径”)。然后分别编写一个脚本(不是在Scala中),将相应的分区按路径复制到每个客户私有bucket中。