如何在读取之前检查S3目录是否存在?
我正在尝试这个,如这里给出的http://bigdatatech.taleia.software/2015/12/21/check-if-exists-a-amazon-s3-path-from-apache-spark/
import org.apache.hadoop.fs.{FileSystem, Path} import org.apache.hadoop.conf.Configuration val fs = FileSystem.get(new Configuration()) fs.listStatus(new Path("s3://s3bucket/2017/10/31/*/*/"))
但得到这个错误
Wrong FS: s3://s3bucket/2017/10/31/*/*, expected: hdfs://ip-172-31-55-167.ec2.internal:8020
我可以使用它的确切路径检查确切的文件是否存在,但是我必须使用像这里"s3:// s3bucket/2017/10/31/*/*"这样不支持的通配符.
检查了这个StackOverflow问题:Spark:只在路径存在时读取文件,但它与我的用例无关.
这是因为在您调用时FileSystem.get(new Configuration())
,已解析的文件系统是默认文件系统,在本例中是hdfs
.
首先需要通过提供包含s3
方案和存储桶的路径的URI来获取正确的文件系统.
使用当前Spark上下文的Hadoop配置也会更好,以确保您将使用与Spark相同的文件系统设置.
import java.net.URI import org.apache.hadoop.fs.FileSystem import org.apache.spark.sql.SparkSession // Create a session with Spark master running locally (vs on a cluster) // for development purposes val sparkSession = SparkSession.builder .appName("My App") .master("local") .getOrCreate val conf = sparkSession.sparkContext.hadoopConfiguration val fs = FileSystem.get(URI.create("s3://s3bucket/"), conf)
只有在类路径上有S3文件系统的实现时,这才有效.我可以看到您在EC2实例上运行程序,因此您应该能够访问S3而无需指定明确的AWS凭据.