在pyspark中一次读取多个实木复合地板文件

时间:2020-09-23 17:33:53

标签: apache-spark pyspark apache-spark-sql

我有多个实木复合地板文件,按ID进行分类,如下所示:

/user/desktop/id=1x/year=2020/month=8/day=12/file1.parquet 
/user/desktop/id=2x/year=2020/month=8/day=15/file2.parquet 
/user/desktop/id=3x/year=2020/month=9/day=11/file3.parquet 
/user/desktop/id=4x/year=2020/month=8/day=22/file4.parquet

我有一个包含所有id值的python列表,如下所示:

id_list = ['1x','2x','3x']

我想同时读取id_list中存在的id的所有文件,并且还想读取对应于month = 8的文件 因此,在此示例中,仅应读取文件1和文件2。

我正在这样做:

sub_path = '/*/*/*/*.parquet'
input_df = sqlContext.read.parquet('/user/desktop/' + 'id={}'.format(*id_list) + sub_path) 

这仅选择id_list的第一个ID为id ='1x'的文件。谁能帮我在这里我所缺少的吗?

1 个答案:

答案 0 :(得分:0)

您可以通过:

id_list = ['1x','2x','3x']
input_df = sqlContext.read.parquet('/user/desktop/').filter(col('id').isin(id_list))

在使用过滤操作时,由于Spark会进行延迟评估,因此数据集的大小应该没有问题。过滤器将在执行任何操作之前应用,并且只有您感兴趣的数据将被保留在内存中,因此仅将所需的所有数据或文件读取到指定ID的内存中。