【问题标题】:read multiple parquet file at once in pyspark在pyspark中一次读取多个镶木地板文件
【发布时间】:2021-09-09 04:10:21
【问题描述】:

我有多个按 id 分类的 parquet 文件,如下所示:

/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 的文件 所以,对于这个例子,只有 file1 和 file2 应该被读取。

我是这样做的:

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

这只会选择 id_list 的第一个 id 内的文件,即 id='1x'。谁能帮我这里缺少什么?

【问题讨论】:

  • 一次所有文件是什么意思?您要读取指定 id 下的所有文件还是该 id 内特定于某天、某月、某年的文件?
  • @Shrey Jakhmola 我想一次读取 id_list 中存在的 id 的所有文件。对于这个例子,我应该能够读取属于 id=1x,2x 和 3x 的三个文件,因为 id_list 中不存在 4x,但我这样做的方式只是读取一个属于 id-1x 的文件
  • 和“一次”-我想说,如果可能的话-想在一行中读取所有匹配的文件。不想先创建空数据框,循环遍历ids,创建个人数据框,联合所有这些事情..

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


【解决方案1】:

你可以这样做:

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

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

【讨论】:

  • 谢谢。你能解释一下为什么 col('id') 吗? Id 是一个子文件夹(/id=something/),而不是 parquet 文件的列,而且 spark 会在其中理解有更多嵌套的子文件夹(年/月/日)而不使用任何野生字符!
  • 收到错误pyspark.sql.utils.AnalysisException: cannot resolve 'id' given input columns:
  • 错误中显示了哪些输入列?理想情况下,它应该包含列id 和路径/user/desktop/。可能是 /user/desktop/ 下的 id=x 以外的其他文件夹可能存在冲突。
  • 为什么要根据 'id' 进行过滤?我不会过滤任何列。我只想根据id读取所有文件
  • 我使用了过滤器,因为列表中存在的所有 ID 都作为列表传递到过滤器中,这将首先下推谓词,并且只会尝试读取提到的 ID。您读取文件夹下数据的方法必须是动态且高效的。如果文件夹结构/user/Desktop/包含分区文件夹/id=(some x)/以外的文件夹,那么在这样的分区方案中存储数据是错误的。
【解决方案2】:

这将准确加载那些在 id_list 和 month=8 中指定 id 的路径

id_list = ['1x','2x','3x']
path = "/user/desktop/id={id}/year=2020/month=8/*/*"
paths = list(map(lambda idx: path.format(idx), id_list))
spark =  SparkSession.builder.appName("sample_app").getOrCreate()
df = spark.read.format("parquet").load(paths)

【讨论】:

    猜你喜欢
    • 2022-06-16
    • 2018-08-13
    • 2016-09-12
    • 2021-03-19
    • 2021-11-10
    • 2020-03-14
    • 2018-05-14
    • 2021-01-12
    相关资源
    最近更新 更多