Я пытаюсь скопировать большой объем данных (более 70 миллионов строк) из одной таблицы в другую. У меня проблема, потому что .set-or-append истекает по таймауту, даже когда я выполняю микропакет вручную. Я готов поспорить, что есть некоторый размер микропакетов с точки зрения строк, которые позволят успешно выполнить .set-or-append, но моя проблема заключается в программном делегировании этих микропакетов команде .set-or-append. Вот что у меня есть на данный момент:
.set-or-append async MyTargetTable <|
let relevantIds= SourceTableName
| summarize innerCount=count() by __id
| where innerCount >= 5000
| top 10000 by innerCount desc;
SourceTableName
| where __id in (relevantIds)
| extend bucket = hash(row_number(), 10)
| partition by bucket
// unsure from here
Функция хеширования в kusto великолепна. Я выполнил базовый запрос, выбрав диапазон от 1 до 70 миллионов в и просмотрев, каково распределение хэш-функции для 10 сегментов, и это было примерно 7 миллионов в каждом. Я хотел бы использовать эту функцию для создания своего разбиения. По сути, это позволяет моим микропакетам иметь примерно одинаковый размер, а затем я могу легко программно увеличивать количество ведер, если микропакеты не работают.
Моя проблема в том, что для разделения по оператору требуется подзапрос, и вы не можете передать .set-or-append в качестве подзапроса для разделения. Поэтому я не уверен, как я могу использовать раздел по оператору с .set-or-append.
Как я могу разделить свои данные на 10 сегментов (или N сегментов) примерно равного размера (в зависимости от количества строк) и программно отправить их в .set-or-append?
Еще одна вещь: поскольку .set-or-append возвращает идентификатор операции, было бы здорово получить список идентификаторов операций для микропакетов, которые были поставлены в очередь.
РЕДАКТИРОВАТЬ: я увидел связанный вопрос и попытался смоделировать свой запрос после его, будет ли что-то вроде этой работы ?:
.set-or-append TargetTable <|
let _Scope = () {
let relevantIds= SourceTable
| summarize innerCount=count() by __id
| where innerCount >= 5000
| top 10000 by innerCount desc;
let cachedIds = materialize(relevantIds);
let BUCKETS = 10;
range bucket from 0 to BUCKETS - 1 step 1
| partition by bucket
{
SourceTable
| where __id in (cacheIds)
| where hash(row_number(), BUCKETS) == toscalar(bucket)
}
};
union (_Scope())
что ты думаешь? будет ли эта очередь помещаться в очередь на 10 операций асинхронного приема, разделенных по номерам строк?