Оператор unionunion operator

Принимает несколько таблиц и возвращает строки из них.Takes two or more tables and returns the rows of all of them.

Table1 | union Table2, Table3

СинтаксисSyntax

T | union [UnionParameters] [kind= inner|outer] [withsource=ColumnName] [isfuzzy= true|false] Table [, Table]...T | union [UnionParameters] [kind= inner|outer] [withsource=ColumnName] [isfuzzy= true|false] Table [, Table]...

Альтернативная форма без разделения ввода:Alternative form with no piped input:

union [UnionParameters] [kind= inner|outer] [withsource=ColumnName] [isfuzzy= true|false] Table [, Table]...union [UnionParameters] [kind= inner|outer] [withsource=ColumnName] [isfuzzy= true|false] Table [, Table]...

АргументыArguments

  • Table:Table:

    • Имя таблицы, например Events.The name of a table, such as Events; or
    • Выражение запроса, которое должно быть заключено в скобки, например (Events | where id==42) или (cluster("https://help.kusto.windows.net:443").database("Samples").table("*")); илиA query expression that must be enclosed with parenthesis, such as (Events | where id==42) or (cluster("https://help.kusto.windows.net:443").database("Samples").table("*")); or
    • Набор таблиц, указанных с помощью подстановочного знака.A set of tables specified with a wildcard. Например, E* будет формировать объединение всех таблиц в базе данных, имена которых начинаются с E.For example, E* would form the union of all the tables in the database whose names begin E.
  • kind:kind:

    • inner — результат содержит подмножество столбцов, которые являются общими для всех входных таблиц.inner - The result has the subset of columns that are common to all of the input tables.
    • outer — значение по умолчанию.outer - (default). Результат содержит все столбцы, которые есть в любых входных таблицах.The result has all the columns that occur in any of the inputs. Для ячеек, которые не определены во входной строке, будет задано значение null.Cells that weren't defined by an input row are set to null.
  • withsource=ColumnName. Если аргумент указан, выходные данные будут содержать столбец с именем ColumnName. В нем для каждой строки будет указано, из какой исходной таблицы она взята.withsource=ColumnName: If specified, the output will include a column called ColumnName whose value indicates which source table has contributed each row. Если запрос эффективно (после нахождения соответствий по подстановочным знакам) ссылается на таблицы из более чем одной базы данных (база данных по умолчанию всегда учитывается), значение этого столбца будет включать имя таблицы, дополненное именем базы данных.If the query effectively (after wildcard matching) references tables from more than one database (default database always counts) the value of this column will have a table name qualified with the database. Точно так же в значение будут добавляться имена кластера и базы данных, если есть ссылка более чем на один кластер.Similarly cluster and database qualifications will be present in the value if more than one cluster is referenced.

  • isfuzzy= true | false. Если для isfuzzy задано значение true, значит для разветвлений union допускается нечеткое разрешение.isfuzzy= true | false: If isfuzzy is set to true - allows fuzzy resolution of union legs. Fuzzy применяется к набору источников union.Fuzzy applies to the set of union sources. Это означает, что при анализе запроса и подготовке к выполнению набор источников union сокращается до набора ссылок на таблицы, которые существуют и доступны в указанный момент.It means that while analyzing the query and preparing for execution, the set of union sources is reduced to the set of table references that exist and are accessible at the time. Если найдена хотя бы одна такая таблица, любая ошибка разрешения приведет к отображению предупреждения в результатах состояния запроса (по одному для каждой отсутствующей ссылки), но это не будет препятствовать выполнению запроса. Если разрешения не были успешными, запрос вернет ошибку.If at least one such table was found, any resolution failure will yield a warning in the query status results (one for each missing reference), but will not prevent the query execution; if no resolutions were successful - the query will return an error. Значение по умолчанию — isfuzzy= false.The default is isfuzzy= false.

  • UnionParameters. Ноль или более разделенных пробелами параметров в виде имя = значение, управляющих поведением операции сопоставления строк и планом выполнения.UnionParameters: Zero or more (space-separated) parameters in the form of Name = Value that control the behavior of the row-match operation and execution plan. Поддерживаются следующие параметры:The following parameters are supported:

    ИмяName ЗначенияValues ОписаниеDescription
    hint.concurrency ЧислоNumber Указывает системе, сколько параллельных вложенных запросов оператора union необходимо выполнять одновременно.Hints the system how many concurrent subqueries of the union operator should be executed in parallel. По умолчанию: количество ядер ЦП на одном узле кластера (от 2 до 16).Default: Amount of CPU cores on the single node of the cluster (2 to 16).
    hint.spread ЧислоNumber Указывает системе, сколько узлов должно использоваться при параллельном выполнении вложенных запросов union.Hints the system how many nodes should be used by the concurrent union subqueries execution. По умолчанию: 1.Default: 1.
  • Table:Table:
    • имя таблицы, например Events.The name of a table, such as Events
    • Выражение запроса, которое должно быть заключено в скобки, например (Events | where id==42).A query expression that must be enclosed with parenthesis, such as (Events | where id==42)
    • Набор таблиц, указанных с помощью подстановочного знака.A set of tables specified with a wildcard. Например, E* сформирует объединение всех таблиц в базе данных, имена которых начинаются с E.For example, E* would form the union of all the tables in the database whose names begin E.

Примечание

Когда список таблиц будет известен, откажитесь от использования подстановочных знаков.Whenever the list of tables is known, refrain from using wildcards. Некоторые рабочие области содержат очень большое количество таблиц, что может привести к неэффективному выполнению.Some workspaces contains very large number of tables that would lead to inefficient execution. Кроме того, со временем могут быть добавлены новые таблицы, что приведет к непредсказуемым результатам.Tables may also be added over time leading to unpredicted results.

  • kind:kind:
    • inner — результат содержит подмножество столбцов, которые являются общими для всех входных таблиц.inner - The result has the subset of columns that are common to all of the input tables.
    • outer — значение по умолчанию.outer - (default). Результат содержит все столбцы, которые есть в любых входных таблицах.The result has all the columns that occur in any of the inputs. Для ячеек, которые не определены во входной строке, будет задано значение null.Cells that weren't defined by an input row are set to null.
  • withsource=ColumnName. Если аргумент указан, выходные данные будут содержать столбец с именем ColumnName. В нем для каждой строки будет указано, из какой исходной таблицы она взята.withsource=ColumnName: If specified, the output will include a column called ColumnName whose value indicates which source table contributed each row. Если запрос эффективно (после нахождения соответствий по подстановочным знакам) ссылается на таблицы из более чем одной базы данных (база данных по умолчанию всегда учитывается), значение этого столбца будет включать имя таблицы, дополненное именем базы данных.If the query effectively (after wildcard matching) references tables from more than one database (default database always counts) the value of this column will have a table name qualified with the database. Точно так же в значение будут добавляться имена кластера и базы данных, если есть ссылка более чем на один кластер.Similarly, the cluster and database qualifications will be present in the value if more than one cluster is referenced.
  • isfuzzy= true | false. Если для isfuzzy задано значение true, значит для разветвлений union допускается нечеткое разрешение.isfuzzy= true | false: If isfuzzy is set to true - allows fuzzy resolution of union legs. Fuzzy применяется к набору источников union.Fuzzy applies to the set of union sources. Это означает, что при анализе запроса и подготовке к выполнению набор источников union сокращается до набора ссылок на таблицы, которые существуют и доступны в указанный момент.It means that while analyzing the query and preparing for execution, the set of union sources is reduced to the set of table references that exist and are accessible at the time. Если найдена хотя бы одна такая таблица, любая ошибка разрешения приведет к отображению предупреждения в результатах состояния запроса (по одному для каждой отсутствующей ссылки), но это не будет препятствовать выполнению запроса. Если разрешения не были успешными, запрос вернет ошибку.If at least one such table was found, any resolution failure will yield a warning in the query status results (one for each missing reference), but will not prevent the query execution; if no resolutions were successful - the query will return an error. Значение по умолчанию — isfuzzy=false.The default is isfuzzy=false.

Возвращаемое значениеReturns

Таблица с количеством строк, соответствующим количеству строк во всех входных таблицах.A table with as many rows as there are in all the input tables.

ПримечанияNotes

  1. Область union может включать инструкции let, если для них указано ключевое слово view.union scope can include let statements if those are attributed with view keyword
  2. Область union не будет включать функции.union scope will not include functions. Чтобы включить функцию в область union, определите инструкцию let с ключевым словом view.To include a function in the union scope, define a let statement with view keyword
  3. Если в качестве входных данных union используются таблицы (в отличие от табличных выражений), а за union следует оператор where, для повышения производительности рекомендуется заменить их оператором find.If the union input is tables (as oppose to tabular expressions), and the union is followed by a where operator, for better performance, consider replacing both with find. Обратите внимание на разные схемы вывода, создаваемые оператором find.Note the different output schema produced by the find operator.
  4. isfuzzy=true применяется только к этапу разрешения источников union.isfuzzy=true only applies to the union sources resolution phase. После определения набора исходных таблиц возможные дополнительные сбои запросов не будут подавляться.Once the set of source tables is determined, possible additional query failures will not be suppressed.
  5. При использовании outer union результат будет включать все столбцы, которые встречаются во входных данных, по одному столбцу для каждого вхождения имени и типа.When using outer union, the result has all the columns that occur in any of the inputs, one column for each name and type occurrences. Это означает, что, если столбец присутствует в нескольких таблицах и имеет несколько типов, он будет иметь соответствующий столбец для каждого типа в результатах union.This means that if a column appears in multiple tables and has multiple types, it will have a corresponding column for each type in the union's result. К этому имени столбца будет добавлен суффикс , за которым следует тип исходного столбца.This column name will be suffixed with a '' followed by the origin column type.
  1. Область union может включать инструкции let, если для них указано ключевое слово view.union scope can include let statements if those are attributed with view keyword
  2. Область union не будет включать функции.union scope will not include functions. Чтобы включить функцию в область union, определите инструкцию let с ключевым словом view.To include function in the union scope - define a let statement with view keyword
  3. Если в качестве входных данных union используются таблицы (в отличие от табличных выражений), а за union следует оператор where, для повышения производительности рекомендуется заменить их оператором find.If the union input is tables (as oppose to tabular expressions), and the union is followed by a where operator, consider replacing both with find for better performance. Обратите внимание на разные схемы вывода, создаваемые оператором find.Please note the different output schema produced by the find operator.
  4. isfuzzy= true применяется только к этапу разрешения источников union.isfuzzy= true applies only to the phase of the union sources resolution. После определения набора исходных таблиц возможные дополнительные сбои запросов не будут подавляться.Once the set of source tables was determined, possible additional query failures will not be suppressed.
  5. При использовании outer union результат будет включать все столбцы, которые встречаются во входных данных, по одному столбцу для каждого вхождения имени и типа.When using outer union, the result has all the columns that occur in any of the inputs, one column for each name and type occurrences. Это означает, что, если столбец присутствует в нескольких таблицах и имеет несколько типов, он будет иметь соответствующий столбец для каждого типа в результатах union.This means that if a column appears in multiple tables and has multiple types, it will have a corresponding column for each type in the union's result. К этому имени столбца будет добавлен суффикс , за которым следует тип исходного столбца.This column name will be suffixed with a '' followed by the origin column type.

Пример Таблицы со строкой в имени или столбцеExample: Tables with string in name or column

union K* | where * has "Kusto"

Строки из всех таблиц в базе данных, имена которых начинаются с K, а в каком-либо столбце содержится слово Kusto.Rows from all tables in the database whose name starts with K, and in which any column includes the word Kusto.

Пример количество различных объектовExample: Distinct count

union withsource=SourceTable kind=outer Query, Command
| where Timestamp > ago(1d)
| summarize dcount(UserId)

Количество различных пользователей, которые за последний день создали событие Query или Command.The number of distinct users that have produced either a Query event or a Command event over the past day. В результате в столбце SourceTable будет указано одно из значений: Query или Command.In the result, the 'SourceTable' column will indicate either "Query" or "Command".

Query
| where Timestamp > ago(1d)
| union withsource=SourceTable kind=outer 
   (Command | where Timestamp > ago(1d))
| summarize dcount(UserId)

Это более эффективный способ получить тот же результат,This more efficient version produces the same result. так как перед объединением каждая таблица отфильтровывается.It filters each table before creating the union.

Пример. С использованием isfuzzy=trueExample: Using isfuzzy=true

// Using union isfuzzy=true to access non-existing view:                                     
let View_1 = view () { print x=1 };
let View_2 = view () { print x=1 };
let OtherView_1 = view () { print x=1 };
union isfuzzy=true
(View_1 | where x > 0), 
(View_2 | where x > 0),
(View_3 | where x > 0)
| count 
СчетчикCount
22

Наблюдение за состоянием запроса — возвращается следующее предупреждение: Failed to resolve entity 'View_3'Observing Query Status - the following warning returned: Failed to resolve entity 'View_3'

// Using union isfuzzy=true and wildcard access:
let View_1 = view () { print x=1 };
let View_2 = view () { print x=1 };
let OtherView_1 = view () { print x=1 };
union isfuzzy=true View*, SomeView*, OtherView*
| count 
СчетчикCount
33

Наблюдение за состоянием запроса — возвращается следующее предупреждение: Failed to resolve entity 'SomeView*'Observing Query Status - the following warning returned: Failed to resolve entity 'SomeView*'

Пример: несоответствие типов исходных столбцовExample: source columns types mismatch

let View_1 = view () { print x=1 };
let View_2 = view () { print x=toint(2) };
union withsource=TableName View_1, View_2
TableNameTableName x_longx_long x_intx_int
View_1View_1 11
View_2View_2 22
let View_1 = view () { print x=1 };
let View_2 = view () { print x=toint(2) };
let View_3 = view () { print x_long=3 };
union withsource=TableName View_1, View_2, View_3 
TableNameTableName x_long1x_long1 x_intx_int x_longx_long
View_1View_1 11
View_2View_2 22
View_3View_3 33

Столбец x из View_1 получил суффикс _long, и так как столбец с именем x_long уже существует в схеме результата, для имен столбцов выполнено удаление дубликатов, что привело к созданию нового столбца — x_long1Column x from View_1 received the suffix _long, and as a column named x_long already exists in the result schema, the column names were de-duplicated, producing a new column- x_long1