azure 如何合并结果行post mv-apply以获得正确的计数

wwwo4jvm  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(99)

使用KQL
鉴于这个数据集

  1. let MyTable = datatable (VMID:int, ID:string, Type:string, features:dynamic, scanner:dynamic)
  2. [
  3. 1, "ID-1", "Windows", dynamic([
  4. {"name": "name1", "value": true},
  5. {"name": "name2", "value": false},
  6. {"name": "name3", "value": true}
  7. ]), dynamic([
  8. {"name": "s1", "expiry": false},
  9. {"name": "s2", "expiry": true},
  10. {"name": "s3", "expiry": true},
  11. {"name": "s4", "expiry": false}
  12. ]),
  13. 2, "ID-1", "Windows", dynamic([
  14. {"name": "name1", "value": true},
  15. {"name": "name2", "value": false},
  16. {"name": "name3", "value": true}
  17. ]), dynamic([
  18. {"name": "s1", "expiry": false},
  19. {"name": "s2", "expiry": true},
  20. {"name": "s3", "expiry": false},
  21. {"name": "s4", "expiry": true}
  22. ]),
  23. 3, "ID-1", "Linux", dynamic([
  24. {"name": "name1", "value": true},
  25. {"name": "name2", "value": false},
  26. {"name": "name3", "value": true}
  27. ]), dynamic([
  28. {"name": "s1", "expiry": false},
  29. {"name": "s2", "expiry": false},
  30. {"name": "s3", "expiry": true},
  31. {"name": "s4", "expiry": false}
  32. ]),
  33. 4, "ID-2", "Windows", dynamic([
  34. {"name": "name1", "value": true},
  35. {"name": "name2", "value": false},
  36. {"name": "name3", "value": true}
  37. ]), dynamic([
  38. {"name": "s1", "expiry": false},
  39. {"name": "s2", "expiry": true},
  40. {"name": "s3", "expiry": false},
  41. {"name": "s4", "expiry": true}
  42. ]),
  43. 5, "ID-2", "Windows", dynamic([
  44. {"name": "name1", "value": true},
  45. {"name": "name2", "value": false},
  46. {"name": "name3", "value": true}
  47. ]), dynamic([
  48. {"name": "s1", "expiry": false},
  49. {"name": "s2", "expiry": true},
  50. {"name": "s3", "expiry": true},
  51. {"name": "s4", "expiry": true}
  52. ])
  53. ];

我想按name1name2过滤要素,按s1s3过滤ScanState,然后计算每个TypeVMID的数量,并给予VMID的列表
1.对于www.example.com = name 1,值== truefeature.name

  1. www.example.com = name2的value = feature.name false
    1.对于www.example.com = s1,has expiration = falsescanState.name
    1.对于www.example.com = s3,has expiration = truescanState.name
    我的主要问题是当使用mv-apply时,它会将JSON分成多行。执行count()会导致额外的结果。
  1. MyTable
  2. | mv-apply features, scanner on (where features.name == "name1" or features.name == "name2" or scanner.name == "s1" or scanner.name == "s3" )
  3. | extend feature1State = tobool(features.name == "name1" and features.value == true)
  4. | extend feature2State = tobool(features.name == "name2" and features.value == false)
  5. | extend scan1State = tobool(scanner.name == "s1" and scanner.expiry == false)
  6. | extend scan2State = tobool(scanner.name == "s3" and scanner.expiry == true)
  7. | summarize vmCount = count(VMID),
  8. f1count = countif(feature1State == true),
  9. f2count= countif(feature2State== true),
  10. scan1count = countif(scan1State == true),
  11. scan2count = countif(scan2State == true),
  12. f1FailVm = make_set_if(VMID, feature1State == false and isnotempty( VMID)),
  13. f2FailVm = make_set_if(VMID, feature2State== false and isnotempty( VMID)),
  14. scan1FailVm = make_set_if(VMID, scan1State == false and isnotempty( VMID)),
  15. scan2FailVm = make_set_if(VMID, scan2State == false and isnotempty( VMID))
  16. by ID, Type

它的输出

请注意,ID-1的VM计数为6,这是不正确的。这是因为mv-apply本质上创建了多行。由于featuresScanner中的条目数不同,所以它选择了它们中的最大值。
有没有更好的办法来解决这个问题。
更新1:使用count_distinct解决VMID,但如何获得正确的失败列表值。使用count_distinct

输出

vhmi4jdf

vhmi4jdf1#

  • 使用vmCount = count_distinct( VMID)代替count(VMID)count_distinct函数用于按Type和Id字段计算不同VMID值的数量。
  • f1FailVm字段是在Type和Id中feature1State字段中没有true的VMID列表。在这种情况下,将第一个集合作为VMID值的集合,这些值在feature1State字段中具有false值,将第二个集合作为VMID值的集合,这些值在feature1State字段中具有true值,然后在它们之间使用set_difference
    代码:
  1. MyTable
  2. | mv-apply features, scanner on (where features.name == "name1" or features.name == "name2" or scanner.name == "s1" or scanner.name == "s3" )
  3. | extend feature1State = tobool(features.name == "name1" and features.value == true)
  4. | extend feature2State = tobool(features.name == "name2" and features.value == false)
  5. | extend scan1State = tobool(scanner.name == "s1" and scanner.expiry == false)
  6. | extend scan2State = tobool(scanner.name == "s3" and scanner.expiry == true)
  7. | summarize vmCount = count_distinct( VMID),
  8. f1count = countif(feature1State == true),
  9. f2count= countif(feature2State== true),
  10. scan1count = countif(scan1State == true),
  11. scan2count = countif(scan2State == true),
  12. f1failVM= set_difference(make_set_if(VMID, feature1State == false), make_set_if(VMID, feature1State == true)),
  13. f2FailVM = set_difference(make_set_if(VMID, feature2State == false), make_set_if(VMID, feature2State == true)),
  14. scan1FailVm = set_difference(make_set_if(VMID, scan1State == false), make_set_if(VMID, scan1State == true)),
  15. scan2FailVm = set_difference(make_set_if(VMID, scan2State == false), make_set_if(VMID, scan2State == true))
  16. by ID, Type

输出:

| ID|类型|vmCount| f1计数|f2count|扫描计数|扫描计数|f1failVM| f2FailVM| scan1FailVm| scan2FailVm|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|
| ID-1| windows |2| 2| 2| 2| 1| []|[]|[]|【2】|
| ID-1| Linux| 1| 1| 1| 1| 1| []|[]|[]|[]|
| ID-2| windows |2| 2| 2| 2| 1| []|[]|[]|[4]美国|
fiddle

展开查看全部

相关问题