当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Spark-scala:在读取之前检查S3目录是否存在》经验,为你挑选了1个好方法。

如何在读取之前检查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:只在路径存在时读取文件,但它与我的用例无关.



1> Alexandre Du..:

这是因为在您调用时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凭据.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有