例如,将原始Schema中的字段类型修改为Union类型后,再添加新的字段类型:
原始Schema:
{ "name": "User", "type": "record", "fields": [ {"name": "id", "type": "int"}, {"name": "name", "type": "string"} ] }
修改后的Schema:
{ "name": "User", "type": "record", "fields": [ {"name": "id", "type": ["int", "null"]}, {"name": "name", "type": ["string", "null"]}, {"name": "email", "type": ["string", "null"]} ] }
使用Avro的Java API解析数据:
//创建Schema对象 Schema schema = new Schema.Parser().parse(new File("user.avsc"));
//解析数据
DatumReader
while (dataFileReader.hasNext()) { user = dataFileReader.next(user);
//读取新字段 if (schema.getField("email") != null) { String email = user.get("email").toString(); //处理email字段 } }
投影:只选择需要的列进行读取,而不需要在Schema中包含所有字段。
例如,原始Schema中有10个字段,但只需要读取其中的3个字段:
Reader.Options options = OrcFile.readerOptions(conf) .filesystem(fs) .maxLength(256 * 1024 * 1024) .orcTail(Collections.emptyList()); options = options.include(new boolean[]{true, true, false, false, false, false, false, false, false, false});
//读取数据 Reader reader = OrcFile.createReader(file, options); RecordReader rows = reader.rows();
while (rows.hasNext()) { VectorizedRowBatch batch = rows.nextBatch(null);
//处理数据 }
Schema演进:通过添加新的列来演进Schema。
例如,将原始Schema中的字段类型修改为Union类型后,再添加新的字段类型:
原始Schema:
struct User { required int32 id; required string name; }
修改后的Schema:
struct User { union {null, int32} id; union