apache-spark - 从文件列表而不是 Spark 中的 PATH 读取是否有效?
问题描述
我在 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/*/*/*/)
但如果第二个真的效率不高,我们可能会重新考虑。
非常感谢您的任何意见或建议!
解决方案
你应该自己尝试一下,这是一个很好的练习。
但是,我会说2nd
option 稍微快一些,因为它不需要额外的 ls。
但我什至不确定,因为 Spark 会检查文件是否为叶子。这可能取决于连接器的实现。cf: def allFiles(): Seq[FileStatus]
除非您在ls
成本较高的文件系统上有数千个文件(通常ls
是 HTTP 请求的云提供商)。它不应该有所作为,您应该从业务角度选择最清晰的选项。这是1st
您提供的选项。
推荐阅读
- jenkins - 如何在分配节点之前在 Jenkins 中加载属性
- prometheus - 当 Prometheus 指标中没有数据时如何不评估警报表达式(Expr)
- hadoop-yarn - 升级 Yarn 会产生有趣的错误信息?这是正常的吗?
- python-3.x - Django 中的函数行为不同
- php - 使用 botman 和 larvel 制作聊天机器人时,botman 聊天框无法正常工作
- grails - 将 sqlRestriction 与 createAlias 一起使用时,“where 子句”中的未知列“x.y”
- sql-server - 有条件地在列之间移动值
- flutter - 如何在 Flutter 中使用 Riverpod 处理基于应用程序状态的条件图标交换?
- typescript - 如何结合对象绑定键和类型声明?
- r - R:使用 dplyr 和 data.table 进行左连接的不同结果