Микропакетирование с разделением по и .set-or-append kusto - PullRequest
0 голосов
/ 07 августа 2020

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

1 Ответ

0 голосов
/ 07 августа 2020

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

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

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

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

  • вы можете «разбить» исходный набор данных с помощью любого фильтра, который имеет смысл WRT ваш набор данных.
  • по сравнению с вариантом 1, этот вариант несколько сложнее.
...