我有两组 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 的新手。
谢谢
考虑相同和不同事件中的数据集,我可以通过以下方式来做到这一点。 将它们分别发布在下面:
--- 同一事件 ---
| 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 *
谢谢