【问题标题】:Replacing/Removing value for a given key in a dynamic value in Kusto在 Kusto 的动态值中替换/删除给定键的值
【发布时间】:2020-01-10 01:50:09
【问题描述】:

在 Kusto 中是否有任何方法可以用来替换 Kusto 中动态值中特定键的值?如果需要,替换值甚至删除整个键值对?

更新

假设我们在一个表中有以下动态值:-

   { 
      "SectionA":{ 
                 "Prop1":"abcd",
                 "Prop2":"efgh",
                 "Prop3":"ahd32",
                 "category":"main"
                 },
      "Num1":1.33,
      "Num2":33.8,
      "City":"New York"
    }

现在我想删除键 Num1 的键值对,以便生成的输出如下:-

   { 
      "SectionA":{ 
                 "Prop1":"abcd",
                 "Prop2":"efgh",
                 "Prop3":"ahd32",
                 "category":"main"
                 },
      "Num2":33.8,
      "City":"New York"
    }

如果这是不可能的,即使以下掩码也可以作为解决方案,我的掩码是指每当键 Num1 出现在动态值中时,它将为所有行分配一个固定值(在此示例中为 0): -

  { 
      "SectionA":{ 
                 "Prop1":"abcd",
                 "Prop2":"efgh",
                 "Prop3":"ahd32",
                 "category":"main"
                 },
      "Num1":0,
      "Num2":33.8,
      "City":"New York"
    }

值可以是任何字符串或数字,在此示例中我使用了数字,但这可以是任何值。

【问题讨论】:

  • 输出应该是动态值本身
  • 即使我们可以从动态值中过滤掉一个特定的键(以及键的值是什么)并返回一个新的值作为结果,这也是可行的
  • 你能举个例子吗?
  • 用一个例子更新了帖子

标签: azure azure-data-explorer kql


【解决方案1】:

更新:

let t = datatable(mystring:string)
[
'
{     "SectionA":{ 
                 "Prop1":"abcd",
                 "Prop2":"efgh",
                 "Prop3":"ahd32",
                 "category":"main"
                 },
      "Num1":180,           
      "Num2":33.8,
      "City":"New York"
}
'
];
t
| project myjson = parse_json(mystring)
| project Num2=tostring(myjson.Num2), City=tostring(myjson.City), SectionA=tostring(myjson.SectionA)
| extend newColumn=strcat("\"City\":","\"",City,"\", \"Num2\":","", Num2,", \"SectionA\":","", SectionA) 

结果:


请尝试下面的代码,看看是否可以解决问题:

let t = datatable(mystring:string)
[
'
{     "SectionA":{ 
                 "Prop1":"abcd",
                 "Prop2":"efgh",
                 "Prop3":"ahd32",
                 "category":"main"
                 },
      "Num1":180,           
      "Num2":33.8,
      "City":"New York"
}
'
];
t
| project myjson = parse_json(mystring)
| project Num2=tostring(myjson.Num2), City=tostring(myjson.City), SectionA=tostring(myjson.SectionA)

结果:

【讨论】:

  • 是的,但这会将最终结果拆分为 3 个单独的列,我想要一个单列结果,如我的示例所示。
  • @Dhiraj,哦,我稍后会尝试更新。
  • 这里有一个挑战。现在我们需要知道将出现的每个键值对的名称。我们可能没有这些信息。我只知道要排除的键。您提供的逻辑明确选择了除我们要删除的值之外的所有其他值。有没有办法只删除我们知道要删除的键,我们不知道其他键可能会出现。
  • 所以我们只知道密钥的名称和路径(在 json 中)。
【解决方案2】:

在 Kusto 动态字典 \ 包中设置具有未知键(或在查询中列出的键过多)的值的另一种方法是使用新的 bag_merge 函数:

let t = dynamic({ 
      "SectionA":{ 
                 "Prop1":"abcd",
                 "Prop2":"efgh",
                 "Prop3":"ahd32",
                 "category":"main"
                 },
      "Num1":1.33,
      "Num2":33.8,
      "City":"New York"
    });

print bag_merge(dynamic({"Num1":0}), t)

【讨论】:

    【解决方案3】:

    bag_remove_keys() 函数从动态属性包中删除键和关联值。唯一的限制是不支持嵌套级别的键。

    datatable(input:dynamic) [
        dynamic({ 
            "SectionA":{ 
                        "Prop1":"abcd",
                        "Prop2":"efgh",
                        "Prop3":"ahd32",
                        "category":"main"
                        },
            "Num1":1.33,
            "Num2":33.8,
            "City":"New York"
        }) ] | extend result=bag_remove_keys(input, dynamic(['Num1']))
    

    【讨论】:

      猜你喜欢
      • 2022-12-06
      • 1970-01-01
      • 2020-03-14
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      相关资源
      最近更新 更多