Как извлечь схему из файла avro в Java

Как вы извлекаете сначала схему, а затем данные из файла avro на Java? Идентично this вопросу, за исключением java.

Я видел примеры того, как получить схему из файла avsc, но не из файла avro. В каком направлении я должен смотреть?

Schema schema = new Schema.Parser().parse(
    new File("/home/Hadoop/Avro/schema/emp.avsc")
);

person mba12    schedule 04.08.2017    source источник


Ответы (3)


Если вы хотите знать схему файла Avro, не создавая соответствующие классы или не заботясь о том, к какому классу принадлежит файл, вы можете использовать GenericDatumReader:

DatumReader<GenericRecord> datumReader = new GenericDatumReader<>();
DataFileReader<GenericRecord> dataFileReader = new DataFileReader<>(new File("file.avro"), datumReader);
Schema schema = dataFileReader.getSchema();
System.out.println(schema);

А затем вы можете прочитать данные внутри файла:

GenericRecord record = null;
while (dataFileReader.hasNext()) {
    record = dataFileReader.next(record);
    System.out.println(record);
}
person Helder Pereira    schedule 12.08.2017
comment
Для тех, кто использует библиотеку C # Avro Apache, служебная функция DataFileReader<GenericRecord>.OpenReader(filename); может использоваться для создания экземпляра dataFileReader. После создания экземпляра dataFileReader используется так же, как в Java. - person Berthier Lemieux; 16.09.2018
comment
Я пытаюсь прочитать схему и данные из массива байтов вместо файла (содержащего как схему, так и полезную нагрузку). Как я могу это сделать? - person Alberto Castaño; 06.03.2020

Спасибо за ответ @Helder Pereira. В качестве дополнения схему также можно получить из getSchema() экземпляра GenericRecord.
Здесь представляет собой живую демонстрацию об этом, ссылка выше показывает, как получить данные и схему в java для форматов данных Parquet, ORC и AVRO.

person Eugene    schedule 12.02.2020

Вы можете использовать библиотеку блоков данных, как показано здесь https://github.com/databricks/spark-avro, который загрузит файл avro в Dataframe (Dataset<Row>)

Если у вас есть Dataset<Row>, вы можете напрямую получить схему, используя df.schema()

person Carlos Bribiescas    schedule 09.08.2017
comment
Извините, я только что понял, что вы на самом деле не использовали Spark. Если вы еще не используете Spark, то мое решение больше проблем, чем оно того стоит. Я оставлю ответ на тот случай, если у кого-то из сторонников Spark возникнет такой же вопрос. - person Carlos Bribiescas; 10.08.2017
comment
Я не использую Spark. Просто баночка с обычными ванильными инструментами avro, но спасибо. - person mba12; 10.08.2017