我想获取AVRO反序列化器创建的记录并将其发送给ElasticSearch。我意识到我必须编写自定义代码来执行此操作。
使用LITERAL选项,我有JSON模式,这是使用GenericRecord的第一步。但是,在整个AVRO Java API中,我看不到将GenericRecord用于一条记录的方法。所有示例都使用DataFileReader。
简而言之,我无法从Flume事件中获取字段。
以前有人这样做过吗? TIA。
答案 0 :(得分:2)
我能够弄清楚。我做了以下事情:
// Get the schema
String strSchema = event.getHeader("flume.avro.schema.literal");
// Get the body
byte[] body = event.getBody();
// Create the avro schema
Schema schema = Schema.Parser.parse(strSchema);
// Get the decoder to use to get the "record" from the event stream in object form
BinaryDecoder decoder = DecoderFactory.binaryDecoder(body, null);
// Get the datum reader
GenericDatumReader reader = new GenericDatumReader(schema);
// Get the Avro record in object form
GenericRecord record = reader.read(null, decoder);
// Now you can iterate over the fields
for (Schema.Field field : schema.getFields()) {
Object value = record.get(field.name());
// Code to add field to JSON to send to ElasticSearch not listed
// ...
} // for (Schema.Field field : schema.getFields()) {
这很有效。