码迷,mamicode.com
首页 > Windows程序 > 详细

Avro文件结构及部分重要API

时间:2016-05-06 12:31:04      阅读:344      评论:0      收藏:0      [点我收藏+]

标签:

Avro文件结构

先上图:
技术分享

datafile(Avro标准序列生成二进制的文件)结构就如该图所示分为两块:

  • 文件头

    • 四个字节’O’, ‘b’, ‘j’开始,后面紧接着1,一般称这四个字节为魔术字符(magic)
    • 紧接着文件头的是AVRO的Meta Data
    • 最后是同步标识结尾
  • 数据块(block)

    • 每个数据块包含有多个对象,可以通过datafileWriter.sync()使得每个数据块仅有一个对象。但是默认情况下数据块有最大值,放不下对象了会开启下一个数据块
    • 同步标记使得可以随机访问数据块,不需要像链表一样依次访问
    • 访问特定的数据块需要上一个数据块的同步标记。同步标记相当于一个指针指向该数据块的末尾,通过next()获取下一个数据块。可参考另一张图:
      技术分享

部分重要API

org.apache.avro.file.DataFileStream

  • public long getBlockCount():返回当前block数据块的对象个数
  • public long getBlockSize():返回当前block数据块的大小

org.apache.avro.file.DataFileReader

  • public void seek(long position) throws IOException:移动到参数指定的同步标记位置,该参数是由DataFileWriter.sync()返回的

  • public void sync(long position) throws IOException:移动到参数指定的位置的下一个同步标记位置。和上一个方法的区别是上一个方法必须知道明确的同步标记的位置,然后直接定位到该位置。而本方法是移动到给定的任意位置的下一个同步标记位。

  • public long previousSync():移动到当前位置的上一个同步标记位置。
  • public long tell() throws IOException:返回当前的位置

org.apache.avro.file.DataFileWriter

  • public long sync() throws IOException:生成一个同步标记位并写入当前数据块的同步标记为字段使得可以传递给DataFileReader.seek(long)使用。同时强制到达本数据块的结尾(开启下一个数据块)

    有些没搞清楚的就是当前的位置是如何给定的?有没有方法可以从一个位置跳转到另一个位置?同步标记为是随机生成?
    添加对象到数据块前用tell()返回当前位置A,用appen()添加对象后在调用tell()返回的仍然是A。那么位置要经过什么情况才会变动??没有仔细研究所有API,暂时无法给出答案。


Avro读写操作

  • 写操作(将对象写入并生成文件存储)
//User对象
        File file = new File("users.avro");
        DatumWriter<User> userDatumWriter = new SpecificDatumWriter<User>(User.class);
        DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(userDatumWriter);
        dataFileWriter.create(user1.getSchema(), new File("users.avro"));
        dataFileWriter.append(user1);
        dataFileWriter.append(user2);
        dataFileWriter.append(user3);
        dataFileWriter.close();
  • 读操作
        DatumReader<User> userDatumReader = new SpecificDatumReader<User>(User.class);
        DataFileReader<User> dataFileReader =
                new DataFileReader<User>(file, userDatumReader);
        User user = null;
        while (dataFileReader.hasNext()) {
            System.out.println(dataFileReader.getBlockSize());
            // Reuse user object by passing it to next(). This saves us from
            // allocating and garbage collecting many objects for files with
            // many items.
            user = dataFileReader.next(user);
            System.out.println(user);
        }

读取时可以使用dataFileReadersync(Long position)seek(Long position)来读取指定的对象

Avro文件结构及部分重要API

标签:

原文地址:http://blog.csdn.net/blackcatdyx/article/details/51328918

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!