Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
将多值动态数组或属性包扩展为多个记录。
mv-expand 可以说与聚合运算符相反,聚合运算符是将多个值打包成单个动态类型化数组或属性包,如 summarize ... make-list() 和 make-series。
(标量)数组或属性包中的每个元素都在运算符的输出中生成一个新记录。 输入中未扩展的所有列都将复制到输出中的所有记录中。
语法
T|mv-expand [kind=(bag | array)] [with_itemindex=IndexColumnName] ColumnName [to typeof(Typename)] [,ColumnName ...] [limitRowlimit]
T|mv-expand [(kind=bag | )] [arrayName=] ArrayExpression [to typeof(Typename)] [, [Name=] ArrayExpression [to typeof(Typename)] ...] [limitRowlimit]
详细了解语法约定。
参数
| 名称 | 类型 | 必选 | DESCRIPTION |
|---|---|---|---|
| ColumnName、ArrayExpression | string |
✔️ | 一个列引用或标量表达式,含 dynamic 类型的值,带有数组或属性包。 数组或属性包的各个顶级元素扩展为多个记录。如果使用“ArrayExpression”且“Name”不等于任何输入列名称时,扩展的值将扩展为输出中的新列。 否则,将替换现有的 ColumnName。 |
| 名称 | string |
新列的名称。 | |
| Typename | string |
✔️ | 指示数组元素的基础类型,该类型将成为 mv-expand 运算符生成的列的类型。 应用类型的操作仅限强制转换,不包括分析或类型转换。 不符合声明类型的数组元素将成为 null 值。 |
| RowLimit | int |
从每个原始行生成的最大行数。 默认值为 2147483647。
mvexpand 是 mv-expand 运算符的已过时的旧形式。 旧版本的默认行限制为 128 行。 |
|
| IndexColumnName | string |
如果指定了 with_itemindex,则输出将包含名为 IndexColumnName 的另一个列,其中包含最初扩展的集合中的项的索引(从 0 开始)。 |
退货
对于输入中的每个记录,运算符会在输出中返回零个、一个或多个记录,具体通过以下方式确定:
未扩展的输入列在输出中显示其原始值。 如果单个输入记录扩展为多个输出记录,会将其值复制到所有记录中。
对于扩展的每个 ColumnName 或 ArrayExpression,则根据扩展模式所述方式确定每个值的输出记录数量。 对于每个输入记录,将计算输出记录的最大数量。 将“并行”扩展所有数组或属性包,以便将缺少的值(如果有)替换为 null 值。 元素已按其在原始数组/包中显示的顺序扩展到行中。
如果动态值为 null,则为该值 (null) 生成单个记录。 如果动态值为空数组或属性包,则不会为该值生成任何记录。 否则,将生成多个记录,因为动态值中有元素。
扩展的列的类型为 dynamic,除非使用 to typeof() 子句显式指定其类型。
扩展模式
支持两种模式的属性包扩展:
-
kind=bag或bagexpansion=bag:将属性包扩展为单个条目属性包。 此模式是默认模式。 -
kind=array或bagexpansion=array:将属性包扩展为双元素[key,value]数组结构,可允许统一访问键和值。 使用此模式还可以(例如)对属性名称运行非重复计数聚合。
例子
本文中的示例使用 帮助群集中的公开可用表,例如
StormEvents数据库中的 表。
本节中的示例演示如何使用语法帮助你入门。
单列 - 数组扩展
datatable (a: int, b: dynamic)
[
1, dynamic([10, 20]),
2, dynamic(['a', 'b'])
]
| mv-expand b
输出
| 一个 | b |
|---|---|
| 1 | 10 |
| 1 | 20 |
| 2 | 一个 |
| 2 | b |
单列 - 包扩展
单个列的简单展开:
datatable (a: int, b: dynamic)
[
1, dynamic({"prop1": "a1", "prop2": "b1"}),
2, dynamic({"prop1": "a2", "prop2": "b2"})
]
| mv-expand b
输出
| 一个 | b |
|---|---|
| 1 | {“prop1”: “a1”} |
| 1 | {“prop2”: “b1”} |
| 2 | {“prop1”: “a2”} |
| 2 | {“prop2”: “b2”} |
单列 - 包扩展为键值对
简单包扩展为键值对:
datatable (a: int, b: dynamic)
[
1, dynamic({"prop1": "a1", "prop2": "b1"}),
2, dynamic({"prop1": "a2", "prop2": "b2"})
]
| mv-expand kind=array b
| extend key = b[0], val=b[1]
输出
| 一个 | b | 钥匙 | 瓦尔 |
|---|---|---|---|
| 1 | ["prop1","a1"] |
prop1 | a1 |
| 1 | ["prop2","b1"] |
prop2 | b1 |
| 2 | ["prop1","a2"] |
prop1 | a2 |
| 2 | ["prop2","b2"] |
prop2 | b2 |
压缩的两个列
首先展开两列以“zip”适用的列,然后展开它们:
datatable (a: int, b: dynamic, c: dynamic)[
1, dynamic({"prop1": "a", "prop2": "b"}), dynamic([5, 4, 3])
]
| mv-expand b, c
输出
| 一个 | b | c |
|---|---|---|
| 1 | {“prop1”:“a”} | 5 |
| 1 | {“prop2”:“b”} | 4 |
| 1 | 3 |
两个列的笛卡尔乘积
如果要在展开两列时获取笛卡尔乘积,请将其逐个展开:
datatable (a: int, b: dynamic, c: dynamic)
[
1, dynamic({"prop1": "a", "prop2": "b"}), dynamic([5, 6])
]
| mv-expand b
| mv-expand c
输出
| 一个 | b | c |
|---|---|---|
| 1 | { “prop1”: “a”} | 5 |
| 1 | { “prop1”: “a”} | 6 |
| 1 | { “prop2”: “b”} | 5 |
| 1 | { “prop2”: “b”} | 6 |
转换输出
若要将 mv-expand 的输出强制为某个特定类型(默认为动态),请使用 to typeof:
datatable (a: string, b: dynamic, c: dynamic)[
"Constant", dynamic([1, 2, 3, 4]), dynamic([6, 7, 8, 9])
]
| mv-expand b, c to typeof(int)
| getschema
输出
| ColumnName | ColumnOrdinal | 日期类型 | 列类型 |
|---|---|---|---|
| 一个 | 0 | System.String |
string |
| b | 1 | System.Object |
dynamic |
| c | 2 | System.Int32 |
int |
请注意 b 列以 dynamic 的形式返回,而 c 以 int 的形式返回。
使用 with_itemindex
通过 with_itemindex 展开数组:
range x from 1 to 4 step 1
| summarize x = make_list(x)
| mv-expand with_itemindex=Index x
输出
| x | 索引 |
|---|---|
| 1 | 0 |
| 2 | 1 |
| 3 | 2 |
| 4 | 3 |
相关内容
- mv-apply 运算符。
- 有关 mv-expand 运算符的对立方,请参阅 summarize make_list()。
- 若要使用属性包键将动态 JSON 对象扩展为列,请参阅 bag_unpack() 插件。
- parse_json 函数
- array_iff 函数