Apache spark 在pyspark中一次读取多个拼花地板文件

Apache spark 在pyspark中一次读取多个拼花地板文件,apache-spark,pyspark,apache-spark-sql,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

我有多个拼花地板文件,按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_list = ['1x','2x','3x']
sub_path = '/*/*/*/*.parquet'
input_df = sqlContext.read.parquet('/user/desktop/' + 'id={}'.format(*id_list) + sub_path) 
我有一个python列表,其中包含所有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_list = ['1x','2x','3x']
sub_path = '/*/*/*/*.parquet'
input_df = sqlContext.read.parquet('/user/desktop/' + 'id={}'.format(*id_list) + sub_path) 
我想一次读取id_列表中存在的id的所有文件,还想读取对应于month=8的文件 因此,对于本例,只应读取文件1和文件2

我是这样做的:

/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_list = ['1x','2x','3x']
sub_path = '/*/*/*/*.parquet'
input_df = sqlContext.read.parquet('/user/desktop/' + 'id={}'.format(*id_list) + sub_path) 
这仅拾取id_列表的第一个id(id='1x')内的文件。有谁能帮我找到我缺少的东西吗?

你可以通过以下方式来完成:

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

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

一次读取所有文件是什么意思?您想读取指定id下的所有文件还是该id内某一天、月、年的特定文件?@Shrey Jakhmola我想立即读取id_列表中存在的id的所有文件。对于这个例子,我应该能够读取三个属于id=1x、2x和3x的文件,因为id_列表中不存在is 4x,但我这样做的方式是“一次”读取一个属于id-1x的文件-我想说,如果可能-希望在一行中读取所有匹配的文件。不希望首先创建空数据帧,循环ID,创建单个数据帧,执行所有这些操作。谢谢。你能解释一下为什么列(‘id’)吗?Id是一个子文件夹(/Id=something/),而不是拼花文件的一列,spark也知道在这里有更多嵌套的子文件夹(年/月/日),而不使用任何通配符!获取错误
pyspark.sql.utils.AnalysisException:无法解析给定输入列的“
id
”:
它在错误中显示了哪些输入列?理想情况下,它应该包含路径
/user/desktop/
的列
id
。可能是
/user/desktop/
下id=x以外的其他文件夹可能存在冲突。为什么要基于“id”进行筛选?我不会过滤任何列。我只想读取所有基于idI的文件,因为列表中的所有ID都已使用过滤器,并作为过滤器中的列表传递,过滤器将首先向下推谓词,并且只尝试读取提到的ID。您读取文件夹下数据的方法必须是动态且高效的。如果文件夹结构
/user/Desktop/
包含除分区文件夹
/id=(某些x)/
之外的文件夹,则在这种分区方案中存储数据是错误的。