Ошибка при чтении сжатого файла Snappy

Я читаю Snappy Compressed file с локального через java.

File snappyFile = new File(fileName);  
Configuration conf = new Configuration();               
CompressionCodec codec = (CompressionCodec)
ReflectionUtils.newInstance(SnappyCodec.class, conf);
FileInputStream is2 = new FileInputStream(snappyFile);
CompressionInputStream cis = codec.createInputStream(is2);
BufferedReader cr = new BufferedReader(new InputStreamReader(cis));

Мой код получает исключение в ReflectionUtils.newInstance

Exception in thread "main" java.lang.RuntimeException: java.lang.NoSuchMethodException: org.xerial.snappy.SnappyCodec.<init>()
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:128)
    at org.finra.oats.AWS.AWSnappyRead.run(AWSnappyRead.java:64)
    at org.finra.oats.AWS.AWSnappyRead.main(AWSnappyRead.java:48)
Caused by: java.lang.NoSuchMethodException: org.xerial.snappy.SnappyCodec.<init>()
    at java.lang.Class.getConstructor0(Class.java:2849)
    at java.lang.Class.getDeclaredConstructor(Class.java:2053)
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:122)
    ... 2 more

Это из-за проблемы несоответствия версий. Я использую snappy 1.1.1.2 версию


person salmanbw    schedule 23.04.2015    source источник
comment
Из вашего вопроса и предоставленной статистики не совсем понятно, чего вы хотите достичь. Вы хотите прочитать сжатый файл Snappy из файловой системы?   -  person SubOptimal    schedule 23.04.2015
comment
Вам следует перефразировать свой вопрос. Кажется, вы пытаетесь прочитать файл последовательности Hadoop. Возможно, вам поможет этот поток SO Чтение и запись файла последовательности с использованием Hadoop 2.0 Apis.   -  person SubOptimal    schedule 23.04.2015
comment
Я уже разместил его там ссылка. вы можете обратиться к ссылке, чтобы получить краткое представление.   -  person salmanbw    schedule 23.04.2015


Ответы (1)


Чтобы прочитать и записать сжатый файл Snappy, вы можете использовать предоставленный SnappyInputStream / SnappyOutputStream классы.

String fileName = "foo.snap";

// write a snappy compressed file
try (OutputStream os = new SnappyOutputStream(new FileOutputStream(fileName))) {
    os.write("Hello Snappy-World".getBytes(Charset.defaultCharset()));
}

// read a snappy compressed file
try (InputStream is = new SnappyInputStream(new FileInputStream(fileName))) {
    byte[] bytes = new byte[100];
    is.read(bytes);
    System.out.println(new String(bytes, Charset.defaultCharset()));
}

// check if the file is compressed with the snappy algorithm
try (InputStream is = new FileInputStream(fileName)) {
    SnappyCodec readHeader = SnappyCodec.readHeader(is);
    if (readHeader.isValidMagicHeader()) {
        System.out.println("is a Snappy compressed file");
        System.out.printf("%s: %d%n%s: %d%n", 
                "compatible version", readHeader.compatibleVersion,
                "version", readHeader.version
        );
    } else {
        System.out.println("is not a Snappy compressed file");                
    }
}
person SubOptimal    schedule 23.04.2015
comment
да SubOptimal, я хочу прочитать сжатый файл Snappy из файловой системы. Я попробовал ваш код, но я получаю эту ошибку. java.io.IOException: FAILED_TO_UNCOMPRESS(5) в org.xerial.snappy.SnappyNative.throw_error(SnappyNative.java:84) - person salmanbw; 23.04.2015
comment
@user3375762 user3375762 Могут быть разные причины. Файл не сжат с помощью Snappy или поврежден. Можете ли вы отправить шестнадцатеричный дамп первых 16 байт? - person SubOptimal; 23.04.2015
comment
@user3375762 user3375762 Это не похоже на быстро сжатый файл. Волшебный заголовок быстро сжатого файла определяется как MAGIC_HEADER = new byte[] { -126, 'S', 'N', 'A', 'P', 'P', 'Y', 0 }; - person SubOptimal; 23.04.2015
comment
@user3375762 user3375762 Я не знаком с hadoop. Поэтому перефразируйте свой вопрос, чтобы было ясно, что вы хотите сделать, и добавьте тег hadoop. Я уверен, что есть читатель, который хотел бы помочь вам по этой теме. - person SubOptimal; 23.04.2015