我有以下S3文件夹,每个文件夹都有镶木地板文件:
s3:// bucket / folder1 / folder2 / 2020-02-26-12 / key = Boston_20200226 /
s3:// bucket / folder1 / folder2 / 2020-02-26-12 / key = Springfield_20200223 /
s3:// bucket / folder1 / folder2 / 2020-02-26-12 / key = Toledo_20200226 /
s3:// bucket / folder1 / folder2 / 2020-02-26-12 / key =费城_20191203 /
我的目标是只能从“ * _20200226”文件夹中打开实木复合地板文件。
我使用FOR循环首先收集所有文件的列表/数组,然后将其传递给spark 2.4中的DF进行READ操作。
s3_files = []
PREFIX = "folder1/folder2/"
min_datetime = current_datetime - timedelta(hours=72)
while current_datetime >= min_datetime:
each_hour_prefix = min_datetime.strftime('%Y-%m-%d-%H')
if any(fname.key.endswith('.parquet') for fname in s3_bucket.objects.filter(Prefix=(PREFIX + each_hour_prefix))):
s3_files.append('s3://{bucket}/{prefix}'.format(bucket=INPUT_BUCKET_NAME, prefix=(PREFIX + each_hour_prefix + '/*')))
min_datetime = min_datetime + timedelta(hours=1)
spark.read.option('basePath',('s3://' + INPUT_BUCKET_NAME)).schema(fileSchema).parquet(*s3_files)
其中fileSchema是实木复合地板文件的架构结构,s3_files是我通过仔细阅读上面的S3文件夹而拾取的所有文件的数组。上面的FOR循环有效,但我的目标是仅读取Boston_20200226和Toledo_20200226文件夹。是否可以进行通配符搜索,例如“ folder1 / folder2 / 2020-02-26-12 / key = ** _ 20200226 *”,或者以某种方式更改“ read.parquet”命令?
谢谢。
更新: 我采用了一种基本方法,即仔细浏览所有文件夹并仅查找与pattern ='20200226'匹配的文件(不是最有效的方法)。我将密钥收集在列表中,然后读取DF中的每个镶木地板文件,最后执行并集。一切正常,除了在最终DF中未读取“键”列。它是创建这些实木复合地板文件的partitionBy()代码的一部分。关于如何捕获“钥匙”的任何想法吗?