繁体   English   中英

Spark读分区——资源成本分析

[英]Spark read partitions - Resource cost analysis

当使用spark.read.json("/A=1/B=2/C=3/D=4/E=5/")类的东西读取 Spark 中按列分区的数据时,将只允许扫描文件夹 E=5。

但是假设我有兴趣通过所有数据源读取C = my_value分区。 指令将是spark.read.json("/*/*/C=my_value/")

在所描述的场景中计算会发生什么? Spark 只会列出 A 和 B 的分区值? 或者它也会扫描所有叶子(实际文件)?

感谢您提出一个有趣的问题。 阿帕奇星火采用Hadoop的FileSystem抽象处理通配符模式。 在源代码中,它们被称为glob 模式

org.apache.hadoop.fs.FileSystem#globStatus(org.apache.hadoop.fs.Path)方法用于返回“与路径模式匹配的路径数组”。 这个函数然后调用org.apache.hadoop.fs.Globber#glob来找出 glob 模式的确切文件匹配算法。 globStatus 由org.apache.spark.sql.execution.datasources.DataSource#checkAndGlobPathIfNecessary 您可以添加一些断点以查看它在后台是如何工作的。

但长话短说:

在所描述的场景中计算会发生什么? Spark 只会列出 A 和 B 的分区值? 或者它也会扫描所有叶子(实际文件)?

Spark 会将您的 glob 分成 3 部分 ["*", "*", "C=my_value"]。 稍后,它将使用 Hadoop org.apache.hadoop.fs.FileSystem#listStatus(org.apache.hadoop.fs.Path)方法列出各个级别的文件。 对于每个文件,它将构建一个路径并尝试将其与当前模式匹配。 匹配的文件将作为“候选”保留,仅在最后一步被过滤掉,此时算法将查找“C=my_value”。

除非你有很多文件,否则这个操作应该不会伤害到你。 也许这就是为什么你应该保留更少但更大的文件的原因之一(著名的“小文件太多”的数据工程问题)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM