从Spark中的多个.gz文件读取特定文件

时间:2019-08-30 15:53:21

标签: java apache-spark apache-spark-sql apache-spark-2.3

我正在尝试读取一个文件夹中多个.gz文件中存在的具有特定名称的文件。
例如,
df.loc[:, df.columns.map(lambda x: not re.search('Length', x))] sepalWidth petalWidth species 0 3.5 0.2 setosa 1 3.0 0.2 setosa 2 3.2 0.2 setosa 3 3.1 0.2 setosa 4 3.6 0.2 setosa

我只对读取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/gzfiles中的wholeTextFiles()方法。但是,它返回tar viz中所有文件的内容。 file1.csv,file2.csv,file3.csv。

有一种方法,我只能读取数据集或RDD中JavaSparkContext的内容。预先感谢!

2 个答案:

答案 0 :(得分:0)

在路径末尾使用*.gz

希望这会有所帮助!

答案 1 :(得分: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();
    }

});