0

我有一个requests包含url, name,timestamp列的数据表,我向其中添加了另一个计算列operationType

我想requests根据定义的动态对象属性进行过滤和查询data,以获得操作及其使用次数,如下所示:

operationType    | Counts
-------------------------
1.1 Operation A  | 2400
-------------------------
1.2 Operation B  | 1500

我有的:

let daysAgo = 100d;
let data = dynamic([
{
    'searchKey': 'url',
    'searchOperator': 'contains',
    'searchValue': 'AjaxContent?option=something',
    'operationName': '1.1 Operation A'
},
{
    'searchKey': 'name',
    'searchOperator': 'matches regex',
    'searchValue': 'POST /api/repo/\\d+/filters',
    'operationName': '1.2 Operation B'
}]);

let req = requests
| where (timestamp >= ago(daysAgo))
| where 

//Issue #1: I want data[0].searchKey to be used as the requests column name
data[0].searchKey contains data[0].searchValue 
//url contains data[0].searchValue //works

//Issue #2: 'doesn't work, error 'matches regex' operator requires string arguments
or name matches data[1].searchValue
//or name matches regex 'POST /api/repo/\\d+/filters' //works

| extend operationType= 
            case(name == data[2].searchValue, data[2].operationName,
                    url contains data[0].searchValue, data[0].operationName
                    'Other - please check'  ) 
| order by timestamp desc;

req | summarize Counts = count() by operationType

理想的情况是创建一个自定义查询,如下所示(甚至可能循环通过动态数组属性data)(Q #3):

requests | where data[0].searchKey data[0].searchOperator data[0].searchValue

在相同的上下文中,理想的方法是将计算operationType列扩展为以某种方式自定义创建(Q #4):

requests
| where
...
| extend operationType= case(url contains data[0].searchValue, data[0].operationName,
                             name matches regex data[0].searchValue, data[0].operationName)

或者

requests
| where
...
| extend operationType= case(data[0].searchKey data[0].searchOperator data[0].searchValue, data[0].operationName,
                             data[1].searchKey data[1].searchOperator data[0].searchValue, data[0].operationName)
  1. 动态值可以用作where语句中的数据表列名(问题#1)吗?
  2. matches regex动态值可以用作语句中的右手吗(问题#2)?
  3. 可以创建动态自定义查询where语句,循环遍历动态数组(Q #3)吗?
  4. 可以在语句中自定义创建计算扩展列case(Q #4)吗?
4

1 回答 1

1

1)动态值可以用作where语句中的数据表列名吗?

是的。请检查:https
: //docs.microsoft.com/en-us/azure/kusto/query/columnifexists 显示 column_ifexists() 和“匹配正则表达式”的示例

datatable (a:string, b:string)
['1', '2']
| where column_ifexists('a', '') matches regex '1'

2)动态值可以用作匹配正则表达式语句中的右手吗?

在某种程度上。通常,仅支持常量值,因此您不能使用行上下文(其中正则表达式会因每一行而异)。但是,您可以使用 toscalar() 将常量正则表达式计算为子查询,并将它们用作“匹配正则表达式”的参数。 https://docs.microsoft.com/en-us/azure/kusto/query/toscalarfunction

3)可以创建动态自定义查询where语句,循环遍历动态数组吗?

不可以。目前不支持动态 KQL 查询。

4) 可以在 case 语句中自定义创建计算扩展列吗?

是的,只要您使用答案#1 和#2 中描述的技术,并且没有遇到#3 的限制。

于 2020-03-20T22:19:22.623 回答