如何通过列值的组合对 S3 输出文件进行分区?

How to partition S3 output files by a combination of column values?

我有正在爬取到 AWS Glue 中的数据。我在那里使用 PySpark 并将其转换为 Parquet 格式。我的原始数据是 CSV,看起来像这样:

id, date, data 1, 202003, x 2, 202003, y 1, 202004, z 等...

我能够成功转换数据,但我不确定获得所需输出的最佳方式。输出应在 S3 中按 ID 和日期拆分。所以它应该是这样的:

s3://bucket/outputdata/{id}_{date}/{data}.parquet

其中 iddate 是数据中的实际 id 和 date 值。其中的文件名显然无关紧要,我只想能够在 S3 对象前缀中创建“文件夹”并拆分其中的数据。

我是 AWS Glue 的新手,我感觉我遗漏了一些非常明显的东西。

提前致谢。

您可以通过连接两个现有列来创建分区列,然后在写入时按新列进行分区,例如

from pyspark.sql.functions import concat, col, lit
df1 = df.withColumn('p', concat(col('id'), lit('_'), col('date')))
df1.write.partitionBy('p').parquet('s3://bucket/outputdata')