出于测试目的,我们希望写入{em>相对本地路径,例如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)
那么是否无法写入本地相对路径?
答案 0 :(得分:0)
要使用Hadoop API访问本地文件系统,您必须在冒号后使用单次/或三次
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.
在Spark中,可以使用--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> \