Spark-scala:在读取之前检查S3目录是否存在

时间:2017-11-06 13:52:20

标签: scala amazon-web-services apache-spark amazon-s3

如何在阅读之前检查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 : Read file only if the path exists,但它与我的用例无关。

4 个答案:

答案 0 :(得分:7)

这是因为当您调用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凭据。

答案 1 :(得分:0)

S3是基于对象的存储,不支持这种语法。 /*/*。您还必须将s3文件系统设置为默认值,并检查群集是否可以访问存储桶。

答案 2 :(得分:0)

这很简单。例如,如果您需要检查是否存在名为Testfolder的目录,请使用以下代码。

val s3login = "s3a://Accesskey:Secretkey@Bucket"
val path = "/Myfolder/Testfolder"    
if(FileSystem.get(new java.net.URI(s3login + path), sc.hadoopConfiguration).exists(new Path(s3login + path)))
{
    println("Directory exists")
}

答案 3 :(得分:0)

import org.apache.hadoop.fs.FileSystem
import org.apache.hadoop.fs.Path
import org.apache.spark.SparkContext
import java.net.URI

var sc = new SparkContext()
if(FileSystem.get(new URI(externalTableLocation), sc.hadoopConfiguration).exists(new Path(externalTableLocation)))
{
  println("File exists")
  val maxPopulatedDate = spark.sql(s"SELECT MAX(DateID) FROM tier_ppw.DistributionDailyFact_Stage")
      log.info("Reading maxPopulatedDate: "+maxPopulatedDate)
}
else
{
   val maxPopulatedDate = "2016-01-01"
   log.info("Reading maxPopulatedDate: "+maxPopulatedDate)
}