gpt4 book ai didi

performance - Spark 读取分区 - 资源成本分析

转载 作者:行者123 更新时间:2023-12-05 03:59:34 25 4
gpt4 key购买 nike

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

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

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

最佳答案

感谢您提出一个有趣的问题。 Apache Spark 使用 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 调用。您可以添加一些断点,看看它是如何工作的。

但长话短说:

What happens computationally in the described scenario under the hood? Spark will just list through the partition values of A and B? Or it will scan through all the leaves (the actual files) too?

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

除非您有很多文件,否则此操作不会对您造成伤害。这可能就是为什么您宁愿保留更少但更大的文件的原因之一(著名的数据工程问题“太多的小文件”)。

关于performance - Spark 读取分区 - 资源成本分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57073871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com