Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
文件合并逻辑:scala_Scala_Hadoop - Fatal编程技术网

文件合并逻辑:scala

文件合并逻辑:scala,scala,hadoop,Scala,Hadoop,对于scala专家来说,这可能是一个愚蠢的问题,但作为初学者,我面临着确定解决方案的困难。任何指示都会有帮助 我在HDFS位置按名称设置了3个文件: fileFirst.dat fileSecond.dat fileThird.dat 它们不一定会以任何顺序存储fileFirst.dat可以在最后创建,因此每次ls都会显示文件的不同顺序 我的任务是按以下顺序将所有文件合并到一个文件中: fileFirst内容,然后fileSecond内容&最后fileThird内容;使用换行符作为分隔符,没有

对于scala专家来说,这可能是一个愚蠢的问题,但作为初学者,我面临着确定解决方案的困难。任何指示都会有帮助

我在HDFS位置按名称设置了3个文件:

fileFirst.dat
fileSecond.dat
fileThird.dat
它们不一定会以任何顺序存储
fileFirst.dat
可以在最后创建,因此每次
ls
都会显示文件的不同顺序

我的任务是按以下顺序将所有文件合并到一个文件中: fileFirst内容,然后fileSecond内容&最后fileThird内容;使用换行符作为分隔符,没有空格

我尝试了一些想法,但没能想出有效的办法。每次组合顺序混乱时

下面是我的函数,用于合并即将出现的内容:

  def writeFile(): Unit = {
    val in: InputStream = fs.open(files(i).getPath)
    try {
      IOUtils.copyBytes(in, out, conf, false)
      if (addString != null) out.write(addString.getBytes("UTF-8"))
    } finally in.close()
}
文件
的定义如下:

val files: Array[FileStatus] = fs.listStatus(srcPath)
这是一个更大的函数的一部分,我将传递此方法中使用的所有参数。完成所有操作后,我将执行
out.close()
关闭输出流


欢迎任何想法,即使它违背了我正在尝试的文件写入逻辑;要知道我在scala方面不是很好;目前:)

如果您可以直接枚举
路径
,您实际上不需要使用
listStatus
。您可以尝试以下方法(未经测试):

val relativePath=Array(“fileFirst.dat”、“fileSecond.dat”、“fileThird.dat”)
val Path=relativePath.map(新路径(srcDirectory,33;))
试一试{
val output=fs.create(destinationFile)
对于(path-throw-ex//,请随意在此处执行一些错误处理
}最后{
input.close()
}
}
}抓住{
case-ex=>throw-ex//请随意在此处执行一些错误处理
}最后{
output.close()
}

如果您可以直接枚举您的
路径
,您实际上不需要使用
listStatus
。您可以尝试类似的方法(未经测试):

val relativePath=Array(“fileFirst.dat”、“fileSecond.dat”、“fileThird.dat”)
val Path=relativePath.map(新路径(srcDirectory,33;))
试一试{
val output=fs.create(destinationFile)
对于(path-throw-ex//,请随意在此处执行一些错误处理
}最后{
input.close()
}
}
}抓住{
case-ex=>throw-ex//请随意在此处执行一些错误处理
}最后{
output.close()
}

那么…你的问题到底是什么?如果这只是文件在
第一、第二、第三…
顺序中的顺序,那么你可以将它们重命名为
file1、file2、file3等…然后对
fs.listStatus(srcPath)的结果进行排序
使用
文件名
。那么…你的问题到底是什么?如果只是文件的顺序是
第一、第二、第三…
顺序,那么你可以将它们重命名为
file1、file2、file3等…然后对
fs.listStatus(srcPath)的结果进行排序
使用
文件名
。我测试了这个逻辑francoisr,它只创建0字节的文件;没有写入任何内容。下面是测试的代码:
尝试{val output=fs.create(destinationFile)for(path e.printStackTrace}
目前,已删除捕获,面临编译问题。这很奇怪。您是否检查了输入文件是否为空?否,输入是完美的。没有空文件。这很奇怪。您可以尝试检查是否可以先复制单个文件。不确定是什么,但如果直接调用copyMerge实用程序,我可以合并文件。如果我根据我的要求修改了它,它甚至没有在本地创建目录。我最好的猜测是因为我通过Spark运行整个代码,执行部分代码的执行者通过不同的用户运行。因此,在复制文件时,他们将面临权限问题。我测试了这个逻辑francoisr,它只创建了0字节的文件;没有写入任何内容。下面是测试代码:
try{val output=fs.create(destinationFile)for(path e.printStackTrace}
目前,已删除捕获,面临编译问题。这很奇怪。您是否检查了输入文件是否为空?否,输入是完美的。没有空文件。这很奇怪。您可以尝试检查是否可以先复制单个文件。不确定是什么,但如果直接调用copyMerge实用程序,我可以合并文件。如果我根据我的要求修改了它,它甚至没有在本地创建目录。我最好的猜测是因为我通过Spark运行整个代码,执行部分代码的执行者通过不同的用户运行。因此,在复制文件时,他们将面临权限问题。
val relativePaths = Array("fileFirst.dat", "fileSecond.dat", "fileThird.dat")
val paths = relativePaths.map(new Path(srcDirectory, _))
try {
    val output = fs.create(destinationFile)
    for (path <- paths) {
        try {
            val input = fs.open(path)
            IOUtils.copyBytes(input, output, conf, false)
        } catch {
            case ex => throw ex // Feel free to do some error handling here
        } finally {
            input.close()
        }
    }
} catch {
    case ex => throw ex // Feel free to do some error handling here
} finally {
    output.close()
}