首页 > 解决方案 > 使用通配符通过火花读取镶木地板文件

问题描述

我在 S3 目录中有许多镶木地板文件。目录结构可能因 vid 而异。像这样的东西:

bucketname/vid=123/year=2020/month=9/date=12/hf1hfw2he.parquet
bucketname/vid=456/year=2020/month=8/date=13/34jbj.parquet
bucketname/vid=876/year=2020/month=9/date=15/ghg76.parquet

我有一个列表,其中包含所有类似这样的视频

vid_list = ['123','456','876']

如何在没有有效性能问题的情况下一次读取 month=9 的所有文件?

current_month=9
temp_df = sqlContext.read.option("mergeSchema", "false").parquet('s3a://bucketname' + 'vid={}/year=2020/month={}/*/*.parquet'.format(*vid_list,current_month))

这给了我错误Path does not exist: file:/Users/home/desktop/test1/vid=123/year=2020/month=456/*/*.parquet;。有没有办法以有效的方式实现这一目标?

标签: python-3.xapache-sparkpyspark

解决方案


试试下面的代码:

vid_list = '(' + '|'.join(['123','456','876']) + ')'
current_month=9
temp_df = sqlContext.read.option("mergeSchema", "false").parquet('s3://bucketname/' + 'vid={}/year=2020/month={}/*/*.parquet'.format(vid_list,current_month))
// URL should look like: s3://bucketname/vid=(123|456|876)/year=2020/month=9/*/*.parquet

您的代码中的错误:月份值是456,应该是9

file:/Users/home/desktop/test1/vid=123/year=2020/month=456/*/*.parquet;

推荐阅读