Микропакетирование с разделением по и .set-or-append kusto

Я пытаюсь скопировать большой объем данных (более 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 операций асинхронного приема, разделенных по номерам строк?


person Jeremy Fisher    schedule 07.08.2020    source источник


Ответы (1)


как вы правильно упомянули - вы не можете вызвать команду управления (например, .set-or-append) из запроса (независимо от того, использует ли этот запрос оператор partition).

чтобы скопировать большие таблицы, вы можете:

  1. экспортировать данные в облачное хранилище, а затем принимают их из больших двоичных объектов с помощью API / такие инструменты, как ADF / LightIngest

  2. организовать набор .set-or-append команд, каждая из которых обрабатывает подмножество исходных данных, до ~ 1 млн записей на команду

  • вы можете «разбить» исходный набор данных с помощью любого фильтра, который имеет смысл. WRT ваш набор данных.
  • по сравнению с вариантом 1 этот вариант несколько сложнее.
person Yoni    schedule 07.08.2020
comment
Спасибо за быстрый ответ! Я знаю о освещении и при необходимости изучу его. Я также пробовал вариант 2, но, поскольку время ожидания запроса истекло из-за количества строк, которые необходимо было загрузить, было бы здорово программно поставить в очередь .set-or-appends. Как вы думаете, команда в моем редакторе будет работать? - person Jeremy Fisher; 07.08.2020
comment
вам не нужно вручную разбивать набор данных, если вы используете параметр distributed для .set-or-append - см. документацию. Тем не менее, как упоминалось в ответе, обработка 10 миллионов записей в одной команде менее предпочтительна - и вам следует серьезно рассмотреть вариант № 1 в ответе - экспорт данных, а затем их захват из облачного хранилища. - person Yoni; 07.08.2020
comment
поддерживает ли команда .export для экспорта в большой двоичный объект очень большой объем данных (более 70 миллионов, но потенциально 1 миллиард)? - person Jeremy Fisher; 07.08.2020
comment
как упоминалось ранее, вы должны «разбить» набор данных таким образом, чтобы каждая команда обрабатывала подмножество исходных данных. для больших наборов данных, если у вас есть возможность «воспроизвести» набор данных из его источника, вам следует подумать о том, чтобы сделать это - person Yoni; 07.08.2020