AWS S3中的FileUtil.copyMerge()

时间:2017-09-19 10:46:11

标签: scala hadoop apache-spark amazon-s3 hdfs

我已使用以下代码将DataFrame加载为HDFS作为text格式。 finalDataFrameDataFrame

finalDataFrame.repartition(1).rdd.saveAsTextFile(targetFile)

执行上面的代码后,我发现使用我提供的文件名创建了一个目录,并在目录下创建了一个文件但不是文本格式。文件名类似于 part-00000

我已使用以下代码在HDFS中解决此问题。

val hadoopConfig = new Configuration()
val hdfs = FileSystem.get(hadoopConfig)
FileUtil.copyMerge(hdfs, new Path(srcPath), hdfs, new Path(dstPath), true, hadoopConfig, null)

现在我可以使用给定的文件名获取上述路径中的文本文件。

但是当我尝试在S3中执行相同的操作时,它会显示一些异常

FileUtil.copyMerge(hdfs, new Path(srcPath), hdfs, new Path(dstPath), true, hadoopConfig, null)

java.lang.IllegalArgumentException: Wrong FS:
s3a://globalhadoop/data, expected:
hdfs://*********.aws.*****.com:8050

似乎S3路径不支持这里。任何人都可以协助如何做到这一点。

2 个答案:

答案 0 :(得分:3)

我使用下面的代码解决了这个问题。

def createOutputTextFile(srcPath: String, dstPath: String, s3BucketPath: String): Unit = {
    var fileSystem: FileSystem = null
    var conf: Configuration = null
    if (srcPath.toLowerCase().contains("s3a") || srcPath.toLowerCase().contains("s3n")) {
      conf = sc.hadoopConfiguration
      fileSystem = FileSystem.get(new URI(s3BucketPath), conf)
    } else {
      conf = new Configuration()
      fileSystem = FileSystem.get(conf)
    }
    FileUtil.copyMerge(fileSystem, new Path(srcPath), fileSystem, new Path(dstPath), true, conf, null)
  }

我已经为S3和HDFS的文件系统编写了代码,两者都运行良好。

答案 1 :(得分:0)

您正在hdfs文件系统中传递FileUtil.copyMerge中的目标FS。您需要获取目的地的真实FS,您可以通过在您创建的目标路径上调用Path.getFileSystem(Configuration)来完成此操作。