#azure-data-explorer
#azure-data-explorer
Вопрос:
Запрос в политике обновления, которую мы используем, имеет ограничение, заключающееся в том, что он отлично работает только с небольшим количеством строк. Скорость поступления в эту исходную таблицу контролируется соответствующим образом. Кроме того, отредактировали политику сегментирования, чтобы разрешить только ограниченное количество строк. Однако обновление начинает завершаться сбоем, когда политика обновления применяется к нескольким экстентам одновременно.
Failed to invoke update policy. Target Table = 'settings', Query = 'let raw_config3 =
__table("raw_config3", 'All', 'AllButRowStore')
| where extent_id() in (guid(58b4a126-8ff2-4c04-a8f8-d6be2629c865), guid(10d66fec-5146-4d63-b3db-d15ba52244b9), guid(8bc99805-9dcd-43ed-8133-402ba77eb566), guid(8127f67e-8d20-4096-bf46-f3736c77ecd5));
getBiosSettings()': Semantic error: 'let raw_config3 =
__table("raw_config3", 'All', 'AllButRowStore')
| where extent_id() in (guid(58b4a126-8ff2-4c04-a8f8-d6be2629c865), guid(10d66fec-5146-4d63-b3db-d15ba52244b9), guid(8bc99805-9dcd-43ed-8133-402ba77eb566), guid(8127f67e-8d20-4096-bf46-f3736c77ecd5));
getBiosSettings()' has the following semantic error: SEM0100: 'summarize' operator: Failed to resolve scalar expression named 'Path'.
Является ли ожидаемый сценарий применения политики обновления к комбинации экстентов? Можно ли это настроить каким-либо образом?
Редактировать 1 — Добавление некоторого контекста к тому, чего мы пытаемся достичь. У нас есть многоуровневые XML-данные, выгруженные в виде одного поля в исходной таблице. Политика обновления использует запрос для извлечения некоторой информации из этого поля и сохранения ее в виде отдельных строк в целевой таблице. Поскольку XML-данные имеют глубину в несколько уровней и содержат поля массива, нам нужно использовать mv expand и bag unpack в указанном запросе. Это прерывается, когда входные данные превышают определенную величину.
Пытался ограничить размер экстента для исходной таблицы с помощью MaxRowCount. Однако политика обновления применяет запрос к нескольким экстентам вместе. Есть ли способ настроить это поведение?
Является ли плохой практикой наличие сложного запроса (как описано выше) в политике обновления?
Редактировать 2 —————————————————————-
Насколько я понимаю, для некоторого обновления исходной таблицы политика обновления должна применяться один раз. Однако мое наблюдение было другим. Объяснение воспроизведения сценария —
Существует исходная таблица «Источник», мы вводим данные в нее каждые 10 минут партиями по 5 записей. Существует политика обновления, настроенная для простого копирования ее в целевую таблицу с именем Target . И существует политика обновления для записи количества данных, с которыми политика выполняется каждый раз, и то же самое сохраняется в Target2.
Учитывая, что мы отправляем одинаковый объем данных каждые 10 минут, я ожидал увидеть постоянное значение в Target2, и для каждой уникальной строки, которую мы отправляем, я ожидаю одну запись в Target2.
Команды установки —
.create table Source(Turn : string, Batch: string, Data: string )
.create table Target(Turn : string, Batch: string, Data: string )
.create table Target2(Count: long )
.create function copySource(){ Source }
.alter table Target policy update
@'[{"IsEnabled": true, "Source": "Source", "Query": "copySource()", "IsTransactional": false}]'
.create function copySourceWithCount() { Source | count }
.alter table Target2 policy update
@'[{"IsEnabled": true, "Source": "Source", "Query": "copySourceWithCount()", "IsTransactional": false}]'
Количество записей, для которых выполняется политика обновления, продолжает регулярно увеличиваться вместо того, чтобы быть постоянным-
Target2
| extend ingestion_time()
| order by $IngestionTime asc
Count $IngestionTime
5 2020-09-27T10:03:50.3236393Z
10 2020-09-27T10:26:52.8994856Z
15 2020-09-27T10:37:04.2836551Z
20 2020-09-27T10:47:05.638047Z
Количество записей в целевой таблице для каждого поступления в исходную таблицу также постоянно меняется. Данные, полученные ранее, имеют большее количество вхождений в целевую таблицу —
Target
| summarize count() by Turn, Batch, Data
| where Turn contains "b"
| order by count_ desc
Turn Batch Data Count
b 0 0 5
b 0 1 5
b 0 2 5
b 0 3 5
b 0 4 5
b 1 0 4
b 1 1 4
b 1 2 4
b 1 3 4
b 1 4 4
b 2 0 3
b 2 1 3
b 2 2 3
b 2 3 3
b 2 4 3
b 3 0 2
b 3 1 2
b 3 2 2
b 3 3 2
b 3 4 2
b 4 0 1
b 4 1 1
b 4 2 1
b 4 3 1
b 4 4 1
Из этого, похоже, политика обновления выполняется для одних и тех же данных несколько раз. Ожидается ли это?
Ответ №1:
Политика обновления выполняется для пакета данных, поступающих в одну операцию приема.
- В зависимости от количества записей в этом пакете и от значения
MaxRowCount
свойства в действующей политике сегментирования. - Этот пакет может охватывать более 1 фрагмента данных (экстента).
- Однако, если в вашем запросе не сделано предположение о количестве входных экстентов (чего не должно быть), это не должно приводить к каким-либо сбоям.
На первый взгляд, семантическая ошибка, показанная в вашем исходном сообщении, относится не к количеству исходных экстентов, а к самому запросу — Failed to resolve scalar expression named 'Path'.
.
- Если бы вы могли предоставить идентификатор действия для сбоя и содержимое названной функции
getBiosSettings()
, мы могли бы помочь вам выяснить фактическую первопричину.
Комментарии:
1. Используемый нами запрос включал использование плагина bag_unpack пару раз, и это прерывается, когда входные данные превышают определенную величину.
2. Отредактировал вопрос, чтобы добавить некоторый контекст к тому, чего мы пытаемся достичь. Повторяя вопрос здесь, является ли плохой практикой иметь сложный запрос в политике обновления?
3. Ошибка, которую вы написали, является семантической ошибкой, которая возникает в результате сочетания логики в вашем запросе на обновление и динамического содержимого / схемы ваших данных. Уменьшение объема данных за операцию приема вряд ли решит проблему — вы должны убедиться, что логика в вашей функции работает на «стабильной» схеме вывода и не делает предположений о содержимом исходных данных, которые могут меняться от одного пакета приема к другому.
4. Я понимаю, что могу отредактировать запрос, чтобы сделать его более надежным. Однако я проверил, что запрос выполняется нормально для 10 записей данных и прерывается на 20 записях одних и тех же данных [одни и те же строки, отправленные повторно]. Плагин bag_unpack прерывается, и это, вероятно, связано с тем, что при наличии больших входных данных существует УСЛОВИЕ LOW_MEOMORY. Учитывая размер данных в строке и требуемую обработку, я пытаюсь попробовать это с меньшим объемом входных данных.
5. Также я подозреваю, что входные данные становятся больше, чем ожидалось, по какой-то причине политика обновления работает. Следовательно, пытаюсь это понять. Добавили к вопросу сценарий, в котором политика обновления заставляет запрос выполняться с одними и теми же данными несколько раз и, следовательно, с большим объемом данных, чем ожидалось. Можете ли вы взглянуть и сообщить мне, является ли это ожидаемым поведением?
Ответ №2:
Как писал Yoni, ошибка, которую вы получаете, не связана с тем фактом, что несколько экстентов обрабатываются вместе как часть политики обновления.
Ошибка гласит 'summarize' operator: Failed to resolve scalar expression named 'Path'
. Из того, что я понимаю из вашего вопроса, иногда вы получаете эту ошибку, а иногда нет. Это означает, что схема вашего запроса не является детерминированной, потому что у вас есть evaluate pivot
evaluate bag_unpack
или что-то подобное в вашем запросе, и в некоторых случаях Path
столбец не создается.
Если это проблема с загружаемыми данными, вам придется ее исправить. Однако, если ожидается, что иногда столбца Path там не будет, тогда вы можете использовать column_ifexists(Path, "DefaultValue")
.
Комментарии:
1. Спасибо, запрос использует bag_unpack и прерывается, когда объем входных данных превышает определенную величину, что приводит к этой ошибке. Итак, я пытался ограничить входные данные, используя MaxRowCount в политике сегментирования. Мы отправляем данные с контролируемой медленной скоростью. Но похоже, что политика обновления применяется к нескольким экстентам одновременно. И это означает, что большие данные и тогда запрос прерывается