我已使用以下代码将DataFrame
加载为HDFS
作为text
格式。 finalDataFrame
是DataFrame
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路径不支持这里。任何人都可以协助如何做到这一点。
答案 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)
来完成此操作。