我试图阅读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
答案 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设置事物的方式(可能不一定想用任何编程语言处理源代码)。