如何访问--files参数指定的文件?读取该文件时路径不存在怎么办?
解决Spark通过
--files上传文件后读取路径不存在的问题 这个问题我之前也碰到过,核心是对Spark --files参数的文件分发逻辑理解有误~
你执行spark2-shell --master yarn --files derp.csv时,Spark确实会把derp.csv分发到YARN集群每个executor的工作目录,但它并不会被放到本地文件系统的根目录,所以你用file:///derp.csv去读取自然会报路径不存在的错误。
下面给你两种可行的解决方法:
方法1:使用SparkFiles工具类获取正确路径
Spark专门提供了SparkFiles.get()方法,它会自动帮你定位到--files上传文件的实际绝对路径,代码示例:
import org.apache.spark.SparkFiles // 获取文件路径并读取 val df = spark.read.csv(SparkFiles.get("derp.csv"))
方法2:直接使用相对路径读取
因为--files上传的文件会被放到executor的当前工作目录下,所以直接用文件名作为相对路径就能读取:
val df = spark.read.csv("derp.csv")
额外说明
如果是在driver端执行读取操作,只要你通过--files提交了文件,driver本地也会同步拿到这个文件,上面两种方法同样适用,不需要额外手动拷贝文件到driver本地。
内容的提问来源于stack exchange,提问作者Carbon
相关产品推荐
相关产品推荐

