Amazon s3 从多个S3存储桶导入pyspark数据帧,其中一列指示条目来自哪个存储桶

Amazon s3 从多个S3存储桶导入pyspark数据帧,其中一列指示条目来自哪个存储桶,amazon-s3,pyspark,pyspark-dataframes,Amazon S3,Pyspark,Pyspark Dataframes,我有一个按日期划分的S3存储桶列表。第一个桶名为2019-12-1,第二个桶名为2019-12-2,以此类推 每个木桶存储我正在读取到pyspark数据框中的拼花地板文件。从每个存储桶生成的pyspark数据帧具有完全相同的模式。我想做的是迭代这些存储桶,并将所有这些拼花地板文件存储到一个pyspark数据框架中,该数据框架有一个日期列,指示数据框架中的每个条目实际上来自哪个存储桶 由于单独导入每个bucket时生成的数据帧的模式是多层的,即每行包含结构数组的结构等,因此我认为将所有bucket

我有一个按日期划分的S3存储桶列表。第一个桶名为2019-12-1,第二个桶名为2019-12-2,以此类推

每个木桶存储我正在读取到pyspark数据框中的拼花地板文件。从每个存储桶生成的pyspark数据帧具有完全相同的模式。我想做的是迭代这些存储桶,并将所有这些拼花地板文件存储到一个pyspark数据框架中,该数据框架有一个日期列,指示数据框架中的每个条目实际上来自哪个存储桶

由于单独导入每个bucket时生成的数据帧的模式是多层的,即每行包含结构数组的结构等,因此我认为将所有bucket组合到一个数据帧中的唯一方法是使用一个带有单个“dates”列的数据帧。“dates”列的每一行都将保存该日期对应的S3存储桶的内容

我可以用这一行读出所有日期:

df = spark.read.parquet("s3://my_bucket/*")
我见过有人通过在此行添加一个'withColumn'调用来创建一个'dates'列来实现我所描述的功能,但我不记得是如何实现的。

使用可以从文件路径中提取S3存储桶名称:

df.withColumn("dates", split(regexp_replace(input_file_name(), "s3://", ""), "/").getItem(0))\
  .show()
我们分割文件名,得到与bucket名称对应的第一部分

也可以使用正则表达式s3:\/\/.+?\/.+完成此操作,第一个组是bucket名称:

df.withColumn("dates", regexp_extract(input_file_name(), "s3:\/\/(.+?)\/(.+)", 1)).show()