Как сохранить Dataframe как текстовый файл, используя определяемое пользователем имя файла в Spark Java - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь сохранить фрейм данных в указанное c местоположение.

successDF.toJavaRDD().saveAsTextFile(successFilePath);

Здесь successFilePath: /hdfs/tmp/20200102/04.dat

Мне нужно сохранить данные с именем файла как 04.dat, где 20200102 и 04 идут как аргументы

Но процесс создает несколько файлов, как показано ниже:

Folder: /hdfs/tmp/20200102/04.dat
Files:
._SUCCESS.crc
.part-00000.crc
_SUCCESS
part-00000

Мое требование заключается в том, что выходной файл должен быть создан в /hdfs/tmp/20200102, и в папке должен быть только 1 файл с имя файла как: 04.dat

Примечание: я использую Spark Java

Пожалуйста, предложите

1 Ответ

0 голосов
/ 10 января 2020

Вы можете создать файл в HDFS без использования Spark:

Используя HDFS API

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class HDFSFileWrite {


public static void main(String[] args) {
    Configuration conf = new Configuration();
    try {
        FileSystem fs = FileSystem.get(conf);
        // Hadoop DFS Path - Input & Output file
        Path inFile = new Path(args[0]);
        Path outFile = new Path(args[1]);
        // Verification
        if (!fs.exists(inFile)) {
            System.out.println("Input file not found");
            throw new IOException("Input file not found");
        }
        if (fs.exists(outFile)) {
            System.out.println("Output file already exists");
            throw new IOException("Output file already exists");
        }

        // open and read from file
        FSDataInputStream in = fs.open(inFile);
        // Create file to write
        FSDataOutputStream out = fs.create(outFile);

        byte buffer[] = new byte[256];
        try {
            int bytesRead = 0;
            while ((bytesRead = in.read(buffer)) > 0) {
                out.write(buffer, 0, bytesRead);
              }
        } catch (IOException e) {
            System.out.println("Error while copying file");
        } finally {
            in.close();
            out.close();
        }

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}
...