为了测试目的,我们想写入相对 target/pipelines
的本地路径。尝试的URI
是
file://target/pipelines/output.parquet
通过Spark
访问:
if (!FileSystem.get(spark.sparkContext.hadoopConfiguration).exists(new Path(path))) {
但是,hadoop filesystem
API似乎对此并不热衷:
Wrong FS: file://target/pipelines/inputData1, expected: file:///
完整的堆栈:
java.lang.IllegalArgumentException:
Wrong FS: file://target/pipelines/inputData1, expected: file:///
at org.apache.hadoop.fs.FileSystem.checkPath(FileSystem.java:649)
at org.apache.hadoop.fs.RawLocalFileSystem.pathToFile(RawLocalFileSystem.java:82)
at org.apache.hadoop.fs.RawLocalFileSystem.deprecatedGetFileStatus(RawLocalFileSystem.java:606)
at org.apache.hadoop.fs.RawLocalFileSystem.getFileLinkStatusInternal(RawLocalFileSystem.java:824)
at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:601)
at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:421)
at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:1426)
at com.mycompany.DataFrameUtils$.generateParquetFile(DataFrameUtils.scala:71)
所以不可能写入本地相对路径?
用于使用Hadoop API访问本地文件系统,您必须在colon
之后使用单个/或//三次 file:/target/pipelines/output.parquet
或
file:///target/pipelines/output.parquet
为了使用相对路径(PWD(,如果是通过命令行 - 下面的命令应起作用。
hadoop fs -Dfs.defaultFS="file:/" -ls testdir
如果要在Scala或Java应用程序中使用相同的内容,则需要在驱动程序代码中设置以下配置,从路径变量中取出file:///
,只需给出相对路径即可。
conf.set("fs.defaultFS","file:/"); # Hadoop Configuration Object.
在火花中,这种配置可以使用-CONF选项在Spark-Submit命令行中骑行,并从路径变量中取出file:///
,只需给出相对路径即可。
./bin/spark-submit
--conf fs.defaultFS="file:/"
--class <main-class>
--master <master-url>
--deploy-mode <deploy-mode>
... # other options
<application-jar>