使用Snappy压缩生成ORC文件格式

时间:2018-02-16 18:55:06

标签: java snappy orc

假设我有一个tsv或csv文件,JAVA中是否有任何编程方式将文件转换为ORC文件格式并对其执行Snappy压缩?

1 个答案:

答案 0 :(得分:0)

BLOT - 这是一个片段,而不是完整的代码。请将其用作参考,并将其嵌入您的解决方案中。

遵循一套快速说明,您可以围绕它构建MapReduce代码。

  1. 在Driver class
  2. 中设置输出格式和压缩编解码器

    在驱动程序类中,将输出格式类设置为ORC。下面的内容[只是一个片段,而不是完整的代码]

    Job = job = Job.getInstance(conf);
    job.setOutputFormatClass(OrcOutputFormat.class);
    FileOutputFormat.setOutputCompressorClass(job,SnappyCompressor.class);
    
    1. reducer需要创建要放入ORC文件的Writable值,并且通常使用OrcStruct.createValue(TypeDescription)函数。对于我们的示例,假设shuffle类型是上一节中的(Text,IntWritable),reduce应该将每个键的整数收集在一起并将它们写为列表。输出模式将是struct>。与MapReduce一样,如果您的方法存储了值,则需要在获取值之前复制它们的值。
    2. public static class MyReducer
        extends Reducer<Text,IntWritable,NullWritable,OrcStruct> {
      
        private TypeDescription schema =
          TypeDescription.fromString("struct<key:string,ints:array<int>>");
        // createValue creates the correct value type for the schema
        private OrcStruct pair = (OrcStruct) OrcStruct.createValue(schema);
        // get a handle to the list of ints
        private OrcList<IntWritable> valueList =
          (OrcList<IntWritable>) pair.getFieldValue(1);
        private final NullWritable nada = NullWritable.get();
      
        public void reduce(Text key, Iterable<IntWritable> values,
                           Context output
                           ) throws IOException, InterruptedException {
          pair.setFieldValue(0, key);
          valueList.clear();
          for(IntWritable val: values) {
            valueList.add(new IntWritable(val.get()));
          }
          output.write(nada, pair);
        }
      }
      

      这应该可以使用HDFS上的snappy压缩编解码器以ORC格式编写数据。