如何在 Splunk 中查找并显示两个 JSON 对象之间唯一和缺失的键?

问题描述 投票:0回答:1

我有两组 JSON 对象,每个对象都有唯一的键。

第一个 JSON :

{ 
    "Sugar": {
        "prod_rate" : "50",
        "prod_qual" : "Good"
    },
    "Rice": {
        "prod_rate" : "80",
        "prod_qual" : "OK"
    },
   "Potato": {
        "prod_rate" : "87",
        "prod_qual" : "OK"
    }
}

第二个 JSON :

{ 
    "Sugar": {
        "prod_rate" : "50",
        "prod_qual" : "Good"
    },
    "Wheat": {
        "prod_rate" : "60",
        "prod_qual" : "Good"
    }
}

如何在任一 JSON 中找到其他 JSON 中不存在的唯一键,并将其显示在表中。
例如,在第一个 JSON 中,唯一键将是“Rice”和“Potato”,缺少的键将是“Wheat”。我想制作一个 Splunk 表,其中两列作为唯一键,缺少键来显示此数据。

请帮忙,我是 Splunk 的新手。

谢谢

json splunk splunk-query
1个回答
0
投票

考虑相同和不同事件中的数据集,我可以通过以下方式来做到这一点。 将它们分别发布在下面:

--- 同一事件 ---

| makeresults 
| eval data1={ 
    \"Sugar\": {
        \"prod_rate\" : \"50\",
        \"prod_qual\" : \"Good\"
    },
    \"Rice\": {
        \"prod_rate\" : \"80\",
        \"prod_qual\" : \"OK\"
    },
   \"Potato\": {
        \"prod_rate\" : \"87\",
        \"prod_qual\" : \"OK\"
    }
}, data2="{ 
    \"Sugar\": {
        \"prod_rate\" : \"50\",
        \"prod_qual\" : \"Good\"
    },
    \"Wheat\": {
        \"prod_rate\" : \"50\",
        \"prod_qual\" : \"Good\"
    
    }
}"
| eval prod_hash_1=json_array_to_mv(json_keys(data1))
| eval prod_hash_2=json_array_to_mv(json_keys(data2))
| eval prod_unique = mvmap(prod_hash_1, if(isnull(mvfind(prod_hash_2, "^".prod_hash_1."$")), prod_hash_1, null()))
| eval prod_missing = mvmap(prod_hash_2, if(isnull(mvfind(prod_hash_1, "^".prod_hash_2."$")), prod_hash_2, null()))
| table data1 data2 prod_unique prod_missing

--- 带有附加列的两个不同事件 ----

index=product_db time="2206589466.725491" | eval data1=if(match(time,"2206589466.725491"),_raw,0)| eval prod_hash_1=json_array_to_mv(json_keys(data1))|table prod_hash_1 |appendcols [ search index=product_db time="2405566003.777518" |eval data2=if(match(time,"2405566003.777518"),_raw,0)
| eval prod_hash_2=json_array_to_mv(json_keys(data2)) ]
| eval prod_unique = mvmap(prod_hash_1, if(isnull(mvfind(prod_hash_2, "^".prod_hash_1."$")), prod_hash_1, null()))
| eval prod_missing = mvmap(prod_hash_2, if(isnull(mvfind(prod_hash_1, "^".prod_hash_2."$")), prod_hash_2, null()))
| table prod_unique prod_missing

--- 没有附加列(更少的较长搜索,优化)---

index=product_db time="2206589466.725491" OR time="2405566003.777518" 
| streamstats c
| eval p_name_{c}=json_array_to_mv(json_keys(_raw)) 
| stats values(p_name_*) as p_name_*
| eval prod_unique = mvmap(prod_hash_1, if(isnull(mvfind(prod_hash_2, "^".prod_hash_1."$")), prod_hash_1, null())) 
| eval prod_missing = mvmap(prod_hash_2, if(isnull(mvfind(prod_hash_1, "^".prod_hash_2."$")), prod_hash_2, null())) 
| table prod_unique prod_missing

--- 下面的查询有效,但它与上面的查询完全不同 ---

| makeresults format=json data="[ {\"Sugar\": {
        \"prod_rate\" : \"50\",
        \"prod_qual\" : \"Good\"
    },
    \"Rice\": {
        \"prod_rate\" : \"80\",
        \"prod_qual\" : \"OK\"
    },
   \"Potato\": {
        \"prod_rate\" : \"87\",
        \"prod_qual\" : \"OK\"
    }
}, { 
    \"Sugar\": {
        \"prod_rate\" : \"50\",
        \"prod_qual\" : \"Good\"
    },
    \"Wheat\": {
        \"prod_rate\" : \"50\",
        \"prod_qual\" : \"Good\"
    }
    
    }]"
| fields _raw _time
| eval prod_name=json_array_to_mv(json_keys(_raw))
| streamstats count as row
| eval flag = pow(2, row - 1)
| mvexpand prod_name
| eval {prod_name}=flag
| fields - flag row prod_name
| stats sum(*) as *

谢谢

© www.soinside.com 2019 - 2024. All rights reserved.