如何从 Spark Dataproc 检查 Google 存储中是否存在文件?
How to check if a file exists in Google Storage from Spark Dataproc?
我假设 Google 存储连接器将允许直接查询 GS,就好像它是 Dataproc 中来自 Spark 的 HDFS 一样,但看起来以下内容不起作用(来自 Spark Shell) :
scala> import org.apache.hadoop.fs.FileSystem
import org.apache.hadoop.fs.FileSystem
scala> import org.apache.hadoop.fs.Path
import org.apache.hadoop.fs.Path
scala> FileSystem.get(sc.hadoopConfiguration).exists(new Path("gs://samplebucket/file"))
java.lang.IllegalArgumentException: Wrong FS: gs://samplebucket/file, expected: hdfs://dataprocmaster-m
有没有办法仅使用 Hadoop API 访问 Google 存储文件?
那是因为 FileSystem.get(...)
returns 默认 FileSystem
根据您的配置是 HDFS
并且只能使用以 hdfs://
开头的路径。使用以下方法获取正确的 FS。
Path p = new Path("gs://...");
FileSystem fs = p.getFileSystem(...);
fs.exists(p);
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.hadoop.fs.{FileSystem, Path}
val p = "gs://<your dir>"
val path = new Path(p)
val fs = path.getFileSystem(sc.hadoopConfiguration)
fs.exists(path)
fs.isDirectory(path)
我翻译了@Pradeep Gollakota 对 PySpark 的回答,谢谢!!
def path_exists(spark, path): #path = gs://.... return true if exists
p = spark._jvm.org.apache.hadoop.fs.Path(path)
fs = p.getFileSystem(spark._jsc.hadoopConfiguration())
return fs.exists(p)
我假设 Google 存储连接器将允许直接查询 GS,就好像它是 Dataproc 中来自 Spark 的 HDFS 一样,但看起来以下内容不起作用(来自 Spark Shell) :
scala> import org.apache.hadoop.fs.FileSystem
import org.apache.hadoop.fs.FileSystem
scala> import org.apache.hadoop.fs.Path
import org.apache.hadoop.fs.Path
scala> FileSystem.get(sc.hadoopConfiguration).exists(new Path("gs://samplebucket/file"))
java.lang.IllegalArgumentException: Wrong FS: gs://samplebucket/file, expected: hdfs://dataprocmaster-m
有没有办法仅使用 Hadoop API 访问 Google 存储文件?
那是因为 FileSystem.get(...)
returns 默认 FileSystem
根据您的配置是 HDFS
并且只能使用以 hdfs://
开头的路径。使用以下方法获取正确的 FS。
Path p = new Path("gs://...");
FileSystem fs = p.getFileSystem(...);
fs.exists(p);
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.hadoop.fs.{FileSystem, Path}
val p = "gs://<your dir>"
val path = new Path(p)
val fs = path.getFileSystem(sc.hadoopConfiguration)
fs.exists(path)
fs.isDirectory(path)
我翻译了@Pradeep Gollakota 对 PySpark 的回答,谢谢!!
def path_exists(spark, path): #path = gs://.... return true if exists
p = spark._jvm.org.apache.hadoop.fs.Path(path)
fs = p.getFileSystem(spark._jsc.hadoopConfiguration())
return fs.exists(p)