从文件列表而不是 Spark 中的 PATH 读取是不是有效?

Posted

技术标签:

【中文标题】从文件列表而不是 Spark 中的 PATH 读取是不是有效?【英文标题】:Is it efficient to read from a LIST of FILES instead of a PATH in Spark?从文件列表而不是 Spark 中的 PATH 读取是否有效? 【发布时间】:2021-09-01 22:40:30 【问题描述】:

我在 azure databricks 中使用 pyspark。并且需要将数千个文件加载为文件列表。使用了“多深度分区”,使得使用基本路径读取文件变得困难。

确实,这种多深度分区会导致嵌套目录触发此错误:

AnalysisException:无法推断 CSV 的架构。一定是 手动指定。;

因此,我们将所有内容作为文件列表读取,我想知道当您使用以下方式读取文件时性能是否相同:

1.

spark.read.format('csv').load('/mnt/article/2021/08/09') 

2.

spark.read.format('csv').load([
        '/mnt/article/2021/08/09/test.csv',
        '/mnt/article/2021/08/09/test2.csv',
        '/mnt/article/2021/08/09/test3.csv'
    ]) 

3.

spark.read.format('csv').load(['/mnt/article/*/*/*/])

由于某些原因,我们不想使用第三个:spark.read.format('csv').load(['/mnt/article/*/*/*/),但如果第二个真的效率不高,我们可能会重新考虑。

非常感谢您的任何意见或建议!

【问题讨论】:

【参考方案1】:

你应该自己尝试一下,这是一个很好的练习。

不过,我想说2nd 选项稍微快一些,因为它不需要额外的 ls。

但我什至不确定,因为 Spark 会检查文件是否为叶子。这可能取决于连接器的实现。参考:def allFiles(): Seq[FileStatus]

除非您在 ls 成本的文件系统上有数千个文件(通常是 ls 是 HTTP 请求的云提供商)。它不应该有所作为,您应该从业务角度选择最清晰的选项。这是您提供的1st 选项。

【讨论】:

以上是关于从文件列表而不是 Spark 中的 PATH 读取是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章

从文本文件创建数据框,在 pyspark 中不起作用

如何将StructType从Spark中的json数据框分解为行而不是列

如何在 Spark 中将文件路径值读取为列?

在本地文件系统(不是HDFS)中使用Scala读取Apache Spark中的文件时如何更改输入块大小[重复]

无法从 synapse spark scala notebook 读取 csv 文件

使用 spark 读取和访问 json 文件中的嵌套字段