Чтение локального файла Parquet без API Had oop Path - PullRequest
3 голосов
/ 28 января 2020

Я пытаюсь прочитать локальный файл Parquet, однако единственные API, которые я могу найти, тесно связаны с Had oop и требуют ввода oop Path (даже для указания на локальный файл). ).

ParquetReader<GenericRecord> reader = AvroParquetReader.<GenericRecord>builder(file).build();
GenericRecord nextRecord = reader.read();

- самый популярный ответ в о том, как читать файл паркета, в отдельном коде java? , но для него требуется oop Path и теперь устарел вместо загадочного InputFile. Единственная реализация InputFile, которую я могу найти, - это HadoopInputFile, так что опять не поможет.

В Avro это просто:

DatumReader<GenericRecord> datumReader = new GenericDatumReader<>();
this.dataFileReader = new DataFileReader<>(file, datumReader);

(где file java.io.File) , Что такое паркетный эквивалент?

Я прошу об отсутствии зависимости Had oop Path в ответах, потому что Had oop таскает в аду раздувания и кувшина, и кажется глупым требовать его для чтения локальных файлы.

Для дальнейшего объяснения предыстории я использую небольшой плагин IntelliJ , который позволяет пользователям перетаскивать файлы Avro на панель для просмотра в таблице. Этот плагин в настоящее время 5 МБ. Если я включу зависимости Parquet и Had oop, он увеличивается до 50 МБ, а даже не работает .


ADDENDUM ADDENDUM

Теперь, когда у меня все работает (благодаря принятому ответу), вот мое рабочее решение, которое позволяет избежать всех надоедливых ошибок, которые можно перетаскивать, в значительной степени завися от API Had oop Path:

Ответы [ 3 ]

2 голосов
/ 05 февраля 2020

К сожалению, реализация паркета java не зависит от некоторых библиотек oop. В их багтрекере существует проблема, связанная с , позволяющая легко читать и записывать файлы паркета в java независимо от того, был ли oop, но, похоже, в этом нет большого прогресса. Интерфейс InputFile был добавлен, чтобы добавить некоторую развязку, но многие классы, которые реализуют часть метаданных паркета, а также все кодеки сжатия, находящиеся внутри зависимости, имели oop зависимость.

Я обнаружил другая реализация InputFile в библиотеке улыбок , это может быть более эффективным, чем проходить через абстракцию файловой системы had oop, но не решает проблему зависимости.

Как уже есть другие ответы Отметим, что вы можете создать HAD oop Path для локального файла и использовать его без проблем.

java.io.File file = ...
new org.apache.hadoop.fs.Path(file.toURI())

Дерево зависимостей, которое получает с помощью oop, может быть значительно уменьшено определяя некоторые исключения. Я использую следующее, чтобы уменьшить раздувание (используя синтаксис gradle):

compile("org.apache.hadoop:hadoop-common:3.1.0") {
    exclude(group: 'org.slf4j')
    exclude(group: 'org.mortbay.jetty')
    exclude(group: 'javax.servlet.jsp')
    exclude(group: 'com.sun.jersey')
    exclude(group: 'log4j')
    exclude(group: 'org.apache.curator')
    exclude(group: 'org.apache.zookeeper')
    exclude(group: 'org.apache.kerby')
    exclude(group: 'com.google.protobuf')
}
1 голос
/ 05 февраля 2020

Если необходимость не использовать Had oop действительно неизбежна, вы можете попробовать Spark и запустить его в локальной версии. Краткое руководство по началу работы можно найти здесь: https://spark.apache.org/docs/latest/index.html. Для скачивания вы можете скачать по этой ссылке: https://archive.apache.org/dist/spark/ (найдите понравившуюся версию, всегда есть сборка без oop. К сожалению, размер сжатой версии по-прежнему составляет около 10-15M ). Вы также можете найти пример Java в examples / src / main.

После этого вы можете прочитать файл в виде Spark Dataframe, как этот

import org.apache.spark.api.java.*;
import org.apache.spark.api.java.function.*; 

SparkSession spark = SparkSession.builder().appName("Reducing dependecy by adding more dependencies").master("local[*]").getOrCreate();
        DataFrame parquet = sqlContext.read().parquet("C:/files/myfile.csv.parquet");
    parquet.show(20);

Это решение Удовлетворить первоначальные условия в вопросе. Тем не менее, это не лишено того факта, что это все равно что бить вокруг бу sh (но, черт возьми, да, это смешно). Тем не менее, это может помочь открыть новый возможный способ решения этой проблемы.

0 голосов
/ 04 февраля 2020

Для этого вы можете использовать ParquetFileReader класс

dependencies {
    compile group: 'org.apache.hadoop', name: 'hadoop-common', version: '3.2.0'
    compile group: 'org.apache.parquet', name: 'parquet-hadoop', version: '1.10.1'
}

Здесь вы можете указать путь к локальному каталогу

private static Path path = new Path("file:\\C:\\myfile.snappy.parquet");

ParquetFileReader r = new ParquetFileReader(conf, path, footer);
...