如何访问--files指定的文件?

时间:2018-03-20 18:37:06

标签: scala apache-spark apache-spark-sql

我试图阅读derp.csv指定的--files,但我找不到路径。怎么办?

spark2-shell --master yarn --files derp.csv
scala> spark.read.csv("file:///derp.csv")
org.apache.spark.sql.AnalysisException: Path does not exist: file:/derp.csv;
  at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$14.apply(DataSource.scala:360)
  at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$14.apply(DataSource.scala:348)
  at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
  at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
  at scala.collection.immutable.List.foreach(List.scala:381)
  at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241)
  at scala.collection.immutable.List.flatMap(List.scala:344)
  at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:348)
  at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:178)
  at org.apache.spark.sql.DataFrameReader.csv(DataFrameReader.scala:533)
  at org.apache.spark.sql.DataFrameReader.csv(DataFrameReader.scala:412)
  ... 48 elided

1 个答案:

答案 0 :(得分:2)

--files将文件添加到您的Spark应用程序,然后可以使用org.apache.spark.SparkFiles对象进行访问。

  

get(filename:String):String 获取通过SparkContext.addFile()添加的文件的绝对路径。

$ cat /tmp/hello.txt
hello world

$ ./bin/spark-shell --files /tmp/hello.txt
...
scala> import org.apache.spark._
import org.apache.spark._

// Use the file name not the path you specified to access it
scala> SparkFiles.get("hello.txt")
res0: String = /private/var/folders/0w/kb0d3rqn4zb9fcc91pxhgn8w0000gn/T/spark-8c6c6b1a-9a63-408b-aec3-87cadbd332be/userFiles-ec82fe16-6460-4509-84d2-dea7eb11365e/hello.txt

scala> spark.read.text(SparkFiles.get("hello.txt")).show
+-----------+
|      value|
+-----------+
|hello world|
+-----------+

来自评论:

  

如果我想使用--files选项添加本地文件,这还适用于纱线群集模式吗?

是。如果没有,请报告。

  

这与addFile方法有什么不同?

它不是最终的,但是addFile是代码的一部分,因此每次要更改要添加的文件时,都必须重新编译代码。对于PySpark来说,这不是什么大问题,但在Scala或Java中它是。

我总是建议使用命令行选项,因为这些是为管理员和devops设置事物的方式(可能不一定想用任何编程语言处理源代码)。