Как распаковать файл snappy (файл в формате hadoop) с помощью Scala

Следуя моему предыдущему вопросу, у меня есть сжатый файл в формате файла hadoop, и я хочу для распаковки и записи содержимого в CSV-файл, как это делает инструмент snzip, snzip -d /Path/to/file.snappy. Я обнаружил, что snappy-java не поддерживает распаковку такого формата. Поэтому я решил использовать org.apache.hadoop.io.compress.SnappyCodec из общего пакета Hadoop. Но я не могу найти ни одного примера того, как это сделать. Вот что я пробовал;

object test extends App {
    val input: Array[Byte] = Files.readAllBytes(Paths.get("/Path/to/file.snappy"))
    val s: SnappyDecompressor = new SnappyDecompressor()
    val dec = s.decompress(input, 0, input.length)
    println(dec)

но это дает мне следующий вывод;

20/01/07 12:59:57 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
0

Бонусный вопрос: как сжать данный файл .csv?


person Anum Sheraz    schedule 07.01.2020    source источник
comment
Рассматривали ли вы возможность использования Spark, который уже поддерживает все эти форматы? Если файл не такой большой, не должно быть проблемой просто запустить встроенную локальную искру.   -  person Luis Miguel Mejía Suárez    schedule 07.01.2020
comment
файлы имеют размер около 75 МБ. Если это легко сделать с помощью этой библиотеки, то зачем идти сложным/долгим путем? Я новичок в Scala/Java, иначе я бы это сделал.   -  person Anum Sheraz    schedule 07.01.2020
comment
ИМХО гораздо проще использовать Spark.   -  person Luis Miguel Mejía Suárez    schedule 07.01.2020
comment
Этот вывод не является ошибкой. В чем проблема? Пожалуйста, покажите все журналы   -  person OneCricketeer    schedule 07.01.2020
comment
Да, это не ошибка, но это тоже не то, что я хочу. s.decompress возвращает целое число 0. Я не знаю, что с этим делать :( ... и это полный журнал вывода.   -  person Anum Sheraz    schedule 07.01.2020


Ответы (1)


Вы забыли использоватьsetInput (см. документация). Что-то вроде следующего должно работать:

object test extends App {
    val input: Array[Byte] = Files.readAllBytes(Paths.get("/Path/to/file.snappy"))
    val s: SnappyDecompressor = new SnappyDecompressor()
    s.setInput(input, 0, input.length)
    var decompressed = new Array[Byte](10*1024)
    decompressor.decompress(decompressed, 0, decompressed.length)
    println(new String(decompressed, StandardCharsets.UTF_8))
}
person Sergey Romanovsky    schedule 07.01.2020
comment
Я думаю, что пробовал это позже, но выдает ошибку; Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.compress.snappy.SnappyDecompressor.decompressBytesDirect() - person Anum Sheraz; 08.01.2020
comment
Перед этим исключением я также получаю Snappy native library not loaded, за которым следует Cannot load org.apache.hadoop.io.compress.snappy.SnappyDecompressor without snappy library!, это на что-то влияет? Обратите внимание, что в мой проект также загружена библиотека xerial.snappy. - person Anum Sheraz; 08.01.2020