Dremel - уровень повторения и определения
Читая статью " Интерактивный анализ наборов данных веб-масштаба", я наткнулся на концепцию уровня повторения и определения.
в то время как я понимаю необходимость этих двух, чтобы иметь возможность устранять неоднозначности, он добавляет уровень повторения и определения к каждому значению.
Что мне неясно, так это то, как они вычисляли уровни...
Это говорит:
Рассмотрим код поля на рисунке 2. Это происходит три раза в r1. Вхождения "en-us" и "en" находятся в первом имени, а "en-gb" - в третьем имени. Чтобы устранить неоднозначность, мы добавляем уровень повторения к каждому значению. Он говорит нам, в каком повторяемом поле на пути поля значение повторяется.
Путь к полю Name.Language.Code содержит два повторяющихся поля: Name и Language. Следовательно, уровень повторения кода находится в диапазоне от 0 до 2; Уровень 0 обозначает начало новой записи. Теперь предположим, что мы сканируем запись r1 сверху вниз. Когда мы встречаемся с "en-us", мы не видим повторяющихся полей, т. Е. Уровень повторения равен 0. Когда мы видим "en", поле языка повторяется, поэтому уровень повторения2.
Я просто не могу заставить меня думать об этом, Name.Language.Code
в r1
имеет en-us
а также en
ценности. Пока первый r = 0
и второй r = 2
потому что два определения были повторены? (язык и код)?
Если бы это было:
Name
Language
Code: en-us
Name
Language
Code: en
Name
Language
Code: en-gb
Будет ли это?
0 2
1 2
2 2
Уровни определения. Каждое значение поля с путем p, esp. каждый NULL имеет уровень определения, указывающий, сколько полей в p, которые могут быть неопределены (потому что они являются необязательными или повторяются), фактически присутствуют в записи.
Почему тогда уровень определения равен 2? Разве это не путь Name.Language
содержать два поля Code
а также Country
где только 1 optional\repeated
?
3 ответа
Вероятно, это больше не интересует вас. Еще кто-то может наткнуться на этот вопрос. Алгоритм чередования Dremel отнюдь не тривиален.
Чтобы ответить на ваш первый вопрос:
Уровень повторения
en-us
0, так как это первое вхождениеname.language.code
Путь в записи.Уровень повторения
en
равно 2, поскольку повторение произошло на уровне 2 (языковой тег).
Чтобы ответить на ваш второй вопрос, для следующей записи,
DocId: 20
Name
Language
Code: en-us
Name
Language
Code: en
Name
Language
Code: en-gb
записи для name.language.code
было бы
en-us 0 2
en 1 2
en-gb 1 2
Объяснение:
- Уровень определения всегда равен двум, поскольку два необязательных тега
name
а такжеlanguage
присутствуют. - Уровень повторения для
en-us
ноль, так как это первыйname.language.code
в записи. - Уровень повторения для
en
а такжеen-gb
1, так как повторение произошло наname
тег (уровень 1).
Это помогает?
Adelin попросила привести еще несколько случайных примеров, чтобы прояснить ситуацию. Чтобы развернуть ответ user152468:
DocId: 20
Name
Language
Code: en-us
Name
Language
Code: en
Name
Language
Code: en-gb
Language
Code: zh
Name
url: 'https://A'
Было бы:
Насколько я понимаю, есть одна запутанная, но важная деталь:
Уровень повторения — это НЕ последовательный индекс повторяющегося поля внутри пути, а индекс поля среди повторяющихся полей внутри пути .
Очевидно, повторяющееся полеName
в вашем примере, и это делает уровень 1 для тех, кто не был первым полем.
Реальная проблема заключается в том, как обозначить повторяющиесяLinks.Forwards
. Последовательный индекс повторяющегося поля,Forwards
, равно 2, но поскольку полеLinks
не повторяется, повторение 1, а не 2.
Эта страница очень помогает, поскольку некоторые комментарии уже упоминались.