1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
| 需要无损保留嵌套格式的结构化信息 只有字段值无法表达清除记录的结构
Repetition Level: 用来表示该字段路径上哪个节点进行了重复 Definition Level: 用来表示该字段路径上有多少可选的字段实际进行了定义
---
假如有两行数据 schema: message Document { required int64 DocId; optional group Links { repeated int64 Backward; repeated int64 Forward; } repeated group Name { repeated group Language { required string Code; optional string Country; } optional string Url; } } 这里改成表结构来看 docid int links<backward array,forward array> array name<language<(code string,country string) map>,url string>
record1 DocId: 10 Links -- 补充位 BackWard: null Forward: 20 Forward: 40 Forward: 60 Name Language Code: 'en-us' Country: 'us' Language Code: 'en' -- 补充位 Country: null Url: 'http://A' Name -- 补充位 Language -- 补充位 Code: null -- 补充位 Country: null Url: 'http://B' Name Language Code: 'en-gb' Country: 'gb' -- 补充位 Url: null
record2 DocId: 20 Links Backward: 10 Backward: 30 Forward: 80 Name -- 补充位 Language -- 补充位 Code: null -- 补充位 Country: null Url: 'http://C'
---
从上到下依次对应的rl和dl DocId(属性为required,不参与dl计算,所以dl=1-1=0) value:10,rl:0,dl:0 value:20,rl:0,dl:0
Links.Backward value:null,rl:0,dl:1 value:10,rl:0,dl:2 value:30,rl:1,dl:2 对于Links.Backward,总共3个值 record1中为null,rl没有重复所以为0,dl因为没有值所以取上一个层次的深度为1 record2中为10,新行,rl为0,dl为实际深度为2 record2中为30,在节点Links重复,rl为1,dl为实际深度为2
Links.Forward value:20,rl:0,dl:2 value:40,rl:1,dl:2 value:60,rl:1,dl:2 value:80,rl:0,dl:2 record1中为20,新行,rl为0,dl为实际深度为2 record1中为40,在节点Links重复,rl为1,dl为实际深度为2 record1中为60,在节点Links重复,rl为1,dl为实际深度为2 record2中为80,新行,rl为0,dl为实际深度为2
Name.Language.Code value:en-us,rl:0,dl:2 value:en,rl:2,dl:2 value:null,rl:1,dl:1 value:en-gb,rl:1,dl:2 value:null,rl:0,dl:1 record1中为en-us,新行,rl为0,dl为实际深度为2(这里解释一下为啥是2,不是3么,因为code是required属性,一定会被定义,所以不参与计算) record1中为en,重复所属节点Language位置,rl为2,dl为实际深度为2 record1中为null,重复所属节点Name位置,rl为1,dl因为没有值所以取上一个层次的深度为1 record1中为en-gb,重复所属节点Name位置,rl为1,dl为实际深度为2 record2中为null,新行,rl为0,dl取Name位置为1
Name.Language.Country value:us,rl:0,dl:3 value:null,rl:2,dl:2 value:null,rl:1,dl:1 value:gb,rl:1,dl:3 value:null,rl:0,dl:1 record1中为us,新行,rl为0,dl为3 record1中为null,在节点Language重复,rl为2,dl为2 record1中为null,在节点Name重复,rl为1,dl为1 record1中为gb,在节点Name重复,rl为1,dl为3 record2中为null,新行,rl为0,在Name处重复,dl为1
Name.Url value:http://A,rl:0,dl:2 value:http://B,rl:1:dl:2 value:null,rl:1:dl:1 value:http://C,rl:0:dl:2 record1中为http://A,新行,rl为0,dl为2 record1中为http://B,在节点Name重复,rl为1,dl为2 record1中为null,在节点Name重复,rl为1,dl为1 record2中为http://C,新行,rl为0,dl为2
总结: 在计算rl时,其实就看这个重复是发生在什么节点上的 record1的Code Name.Language.Code: 'en-us' Name.Language.Code: 'en' 这两个Code因为属于同一个Name下不同的Language,所以en的rl为2 在计算dl时,其实就是在算整条路径下除了required属性之外的节点数 这也是为啥Name.Language.Code论层次有3层,但是dl缺是2的原因
|