整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

4.4.6排列顺序

hadoop 花牛 10℃ 0评论

Avro定义了对象的排列顺序。Avro大多数类型的排列顺序与用户的期望符合例如,数值型按照数值的升序进行排列。其他的就没有那么巧妙了。

例如,枚举通过符号的定义而非符号字符串的值来排序。

除了 record之外,所有类型均按照Avro规范中预先定义的规则来排序, 这些规则不能被用户改写。但对于记录,可以指定order属性来控制排列顺序。它有三个值:ascending(默认值)、descending(降序)或ignore(所以为了比较的目的,可以忽略该字段。)

例如,通过将right字段设置为descending,下述模式(SortedStringPair.avsc)定义StringPair记录按降序顺序。为了排序的目的,忽略了left字段, 但依旧保留在投影中:

{
    "type": "record",
    "name": "StringPair",
    "doc": "A pair of strings, sorted by right field descending.",
    "fields":[
        {"name": "left", "type": "string", "order": "ignore"},
        {"name": "right", "type": "string", "order": "descending"}
    ]
}

按照读取模式中的文档顺序,记录中的字段两两进行比较。这样,通过指定一个恰当的读取模式,便可以对数据记录使用任意顺序。该模式(SwitchedStringpair.avsc)首先定义了一组right字段的顺序,然后是left字段的顺序:

{
    "type": "record",
    "name": "StringPair",
    "doc": "A pair of strings, sorted by right then left.",
    "fields":[
        {"name": "right", "type": "string"},
        {"name": "left", "type": "string"}
    ]
}

Avro实现了高效的二进制比较。也就是说,Avro不需要将二进制对象反序列化成对象即可实现比较,因为它可以直接对字节流进行操作。该属性的一个有用结果是,我们根据可以从对象或相应的二进制表示(后者在BinaryData对象上使用hashCode()静态方法)算出Avro数据的哈希代码,两种情况下获得的结果相同。在使用StringPair模式的情况下(没有order属性),Avro按以下方式实现了二进制比较。

第一个字段(即left字段),使用UTF-8编码,由此Avro可以根据字母表顺序进行比较。如果它们的顺序不确定的,那么Avro可以在该处停止比较。否则,如果这两个字节顺序是相同的,那么它们比较第二个字段 (right),同样在字节尺度上使用字母表序排列,因为该字段同样也使用 UTF-8编码。

Avro为我们提供了比较器,所以我们无需重写和维护这部分代码。同时,可以通过修改读取模式来简单修改排列顺序。对于SortedStringPair.avscSwitchedStringpair.avsc模式来说,Avro所使用的比较方法本质上与刚才所描述的是一致的,只不过要考虑比较哪个字段,考虑使用哪种顺序,是升序还是降序。

在本章后面,我们将Avro的排序逻辑和MapReduce联合使用,实现Avro数据文件的并行排序。

转载请注明:全栈大数据 » 4.4.6排列顺序

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址