【问题标题】:KQL / Kusto: Can I consolidate the "remaining" columns into one catchall column?KQL / Kusto:我可以将“剩余”列合并到一个包罗万象的列中吗?
【发布时间】:2023-01-19 03:04:25
【问题描述】:

我输入了一组已知的列(比如空调) 和可变数量的附加列。我想将其提取到包含列的表中空调加一栏其余的部分.所以从输入一种进入一种,进入等等,如果存在于它将去的记录中其余的部分作为“D”:“D的价值”.对于包含的另一条记录X它会变成A, B, C, theRest=["X":"valueofX", "Y":"valueofY"]

我正在尝试一些类似的东西

T | project A, B, C, theRest = bag_remove_keys(pack_all(), dynamic(["A","B","C"]))

这基本上做了我想要的,除了(当然)我的情况有点复杂,而不是手工编码dynamic(["A","B","C","D","E"],我想为dynamic(<expression>)创建一些东西,其中<expression>是表格中的列名数组表达式T。表达式 T 具有不同数量的列,因此 bag_remove_keys() 删除的列也不同。

在@David 的第一个回答后编辑: 我的例子可能太简单了。 这是我的代码,除了格式化其余的部分.

let T= datatable (data: dynamic)
[
dynamic([{"A":1,"B":2,"C":3}]),
dynamic([{"X":4,"A":1,"B":5,"C":3,"Y":2}]),
dynamic([{"A":3,"G":7,"B":2,"C":1}]),
];
let X = datatable(A:int, B:int, C:int, data:dynamic) [];
let T_base_cols = toscalar(X | getschema | summarize make_list(ColumnName));
T | mv-expand Results = data
   | project  A=toint(Results['A']),
              B=toint(Results['B']),
              C=toint(Results['C']),
              theRest = bag_remove_keys(pack_all(), T_base_cols)

这给出了这样的输出

A   B   C   theRest
1   2   3   {"Results":{"A":1,"B":2,"C":3}}
1   5   3   {"Results":{"X":4,"A":1,"B":5,"C":3,"Y":2}}
3   2   1   {"Results":{"A":3,"G":7,"B":2,"C":1}}

我期待着

A   B   C   theRest
1   2   3   
1   5   3   {"X":4,"Y":2}
3   2   1   {"G":7}

或最后一列中没有花括号的类似格式。

【问题讨论】:

  • 您确定您的源数据 (T) 是由数组构建的吗?
  • 你确定你的源数据(T)是由数组构建的(它没有太大变化,只需要一个额外的 mv-expand 操作)?

标签: azure-data-explorer kql data-ingestion


【解决方案1】:

这是一个完全动态的解决方案。

我已将表名更改为来源目标因此在更新策略的上下文中会更容易理解发生了什么。

let source = datatable (data: dynamic)
[
    dynamic([{"A":1,"B":2,"C":3}])
   ,dynamic([{"X":4,"A":1,"B":5,"C":3,"Y":2}])
   ,dynamic([{"A":3,"G":7,"B":2,"C":1}])
];
let target = datatable(A:int, B:int, C:int, data:dynamic)[];
let target_fixed_cols = toscalar
(
    target 
    | getschema 
    | summarize make_list_if(ColumnName, ColumnName != "data")
);
source
| mv-expand data
| extend target_rest_keys = set_difference(bag_keys(data), target_fixed_cols)
| extend target_fixed_bag = bag_remove_keys(data, target_rest_keys)
| evaluate bag_unpack(target_fixed_bag)
| extend theRest = bag_remove_keys(data, target_fixed_cols)
| extend theRest = iff(array_length(bag_keys(theRest)) == 0, dynamic(null), theRest)
| project-away data, target_rest_keys
A B C theRest
1 2 3
1 5 3 {"X":4,"Y":2}
3 2 1 {"G":7}

Fiddle

【讨论】:

    【解决方案2】:

    如果事先知道目标表列(A、B 和 C),它就会变得非常简单。
    最后一行用于将空包 ({}) 替换为动态空值。

    let source = datatable (data: dynamic)
    [
        dynamic([{"A":1,"B":2,"C":3}])
       ,dynamic([{"X":4,"A":1,"B":5,"C":3,"Y":2}])
       ,dynamic([{"A":3,"G":7,"B":2,"C":1}])
    ];
    let target = datatable(A:int, B:int, C:int, data:dynamic)[];
    let target_fixed_keys = dynamic(["A", "B", "C"]);
    source
    | mv-expand data
    | project A = data.A
             ,B = data.B
             ,C = data.C
             ,theRest = bag_remove_keys(data, target_fixed_keys)
    | extend theRest = iff(array_length(bag_keys(theRest)) == 0, dynamic(null), theRest)
    
    A B C theRest
    1 2 3
    1 5 3 {"X":4,"Y":2}
    3 2 1 {"G":7}

    Fiddle

    【讨论】:

      猜你喜欢
      • 2011-05-03
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      相关资源
      最近更新 更多