将csv数据从外部源导入HDFS并以特定格式存储的过程和工具是众所周知的。但是,如何为HDFS中已存在的数据转换数据格式?

我正在使用Json格式/未压缩的HDFS上的现有数据集(〜多个TB)。如何在最小化群集资源的同时将群集上的数据转换为同一群集上的Parquet?

选项:

  • 临时获取另一个相同大小的集群,并在转换时移走所有数据,然后移回数据吗?
  • 暂时补充现有集群上的其他节点吗?如何确保仅将其用于此迁移?
  • ??

  • 谢谢,

    马特

    最佳答案

    您可以编写一个Java代码,使用ParquetOutputFormat类将现有的csv文件转换为 Parquet 。在here中查找Parquet实现。

    代码将如下所示:

        public static void main(String[] args) throws IOException,
            InterruptedException, ClassNotFoundException {
    
        Configuration conf = new Configuration();
        Job job = new Job(conf);
        job.setJobName("CSV to Parquet");
        job.setJarByClass(Mapper.class);
    
        job.setMapperClass(Mapper.class);
        job.setReducerClass(Reducer.class);
    
        job.setNumReduceTasks(1);
    
        job.setOutputKeyClass(LongWritable.class);
        job.setOutputValueClass(Text.class);
    
        job.setOutputFormatClass(ParquetOutputFormat.class);
        job.setInputFormatClass(TextInputFormat.class);
    
        TextInputFormat.addInputPath(job, new Path("/csv"));
        ParquetOutputFormat.setOutputPath(job, new Path("/parquet"));
    
        job.waitForCompletion(true);
       }
    
    /csv是csv文件的HDFS路径,而/parquet是新的镶木文件的HDFS路径。

    Source

    10-04 14:07
    查看更多