0

我正在尝试读取具有特定名称的文件,该文件存在于文件夹中的多个 .gz 文件中。
例如
D:/sample_datasets/gzfiles |-my_file_1.tar.gz |-my_file_1.tar |-file1.csv |-file2.csv |-file3.csv |-my_file_2.tar.gz |-my_file_2.tar |-file1.csv |-file2.csv |-file3.csv

我只对阅读file1.csv所有.gz文件中具有相同架构的内容感兴趣。

我将路径传递D:/sample_datasets/gzfileswholeTextFiles(). JavaSparkContext但是,它会返回 tar viz 中所有文件的内容。文件 1.csv、文件 2.csv、文件 3.csv。

有没有办法我只能读取file1.csvDataset 或 RDD 中的内容。提前致谢!

4

2 回答 2

0

我能够使用我从 SO 上的多个答案中使用的以下片段来执行该过程


JavaPairRDD tarData = sparkContext.binaryFiles("D:/sample_datasets/gzfiles/*.tar.gz");
JavaRDD tarRecords = tarData.flatMap(new FlatMapFunction, Row>(){
    private static final long serialVersionUID = 1L;

    @Override
    public Iterator call(Tuple2 t) throws Exception {
        TsvParserSettings settings = new TsvParserSettings();
        TsvParser parser = new TsvParser(settings);

        List records = new ArrayList();
        TarArchiveInputStream tarInput = new TarArchiveInputStream(new GzipCompressorInputStream(t._2.open()));
        TarArchiveEntry entry;
        while((entry = tarInput.getNextTarEntry()) != null) {
            if(entry.getName().equals("file1.csv")) {
                InputStreamReader streamReader = new InputStreamReader(tarInput);
                BufferedReader reader = new BufferedReader(streamReader);
                String line;

                while((line = reader.readLine())!= null) {
                    String [] parsedLine = parser.parseLine(line);
                    Row row = RowFactory.create(parsedLine);

                    records.add(row);
                }

                reader.close();
                break;
            }
        }
        tarInput.close();
        return records.iterator();
    }

});
于 2019-09-04T06:54:35.197 回答
0

*.gz在路径的尽头使用。

希望这可以帮助!

于 2019-08-31T18:07:23.307 回答