Я пытаюсь скопировать большой объем данных (более 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 великолепна. Я выполнил базовый запрос c, выбрав диапазон от 1 до 70 миллионов дюймов, и посмотрел, каково распределение функции ha sh для 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 асинхронных c операций приема, разделенных по номеру строки?