логика слияния файлов: scala - PullRequest
1 голос
/ 28 мая 2019

Для экспертов по scala это может быть глупым вопросом, но я, как новичок, сталкиваюсь с трудностями в поиске решения. Любые указатели помогут.

Я установил 3 файла в папке HDFS по именам:

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()
}

Files определяется следующим образом:

val files: Array[FileStatus] = fs.listStatus(srcPath)

Это часть большой функции, в которой я передаю все аргументы, используемые в этом методе. После того, как все будет сделано, я сделаю out.close(), чтобы закрыть поток вывода.

Любые идеи приветствуются, даже если они противоречат логике записи файла, которую я пытаюсь сделать; просто пойми, что я не так хорош в scala; на данный момент:)

1 Ответ

0 голосов
/ 28 мая 2019

Если вы можете перечислить ваш Paths напрямую, вам не нужно использовать listStatus. Вы можете попробовать что-то вроде этого (не проверено):

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()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...