Splunk 左连接未按预期提供
Splunk left jion is not giving as exepcted
需求:我想查询一下,某一天使用的支付卡信息是否有使用相同支付卡信息下的电话销售订单。
我尝试了以下查询,它应该为我提供来自在线订单的所有支付卡信息和来自电话销售的匹配支付信息。但是我没有给出正确的结果,基本上结果显示没有电话销售的付款信息,但是当我搜索 splunk 时,我也发现了电话销售。所以查询错误。
index="orders" "Online order received" earliest=-9d latest=-8d
| rex field=message "paymentHashed=(?<payHash>.([a-z0-9_\.-]+))"
| rename timestamp as onlineOrderTime
| table payHash, onlineOrderTime
| join type=left payHash [search index="orders" "Telesale order received" earliest=-20d latest=-5m | rex field=message "paymentHashed=(?<payHash>.([a-z0-9_\.-]+))" | rename timestamp as TeleSaleTime | table payHash, TeleSaleTime]
| table payHash, onlineOrderTime, TeleSaleTime
请帮助我修正查询或找出满足我要求的结果的查询。
join
命令需要一个字段名称列表,每个搜索的事件将在这些字段名称上进行匹配。如果未列出任何字段,则使用所有字段。在该示例中,字段 'onlineOrderTime' 和 'TeleSaleTime' 仅存在于联接的一侧,因此无法进行匹配。解决方法很简单:指定公共字段名称。 ... | join type=left payHash ...
.
首先,您可以删除最后一行 | table payHash, onlineOrderTime, TeleSaleTime
,因为它什么都不做(连接命令已经连接了您创建的两个 table)。
其次,当 运行 两个查询分别进行时 - 两个查询具有相同的 "payHash"es?两个查询 return 返回 table 的真实结果?
因为从表面上看,您正确使用了 join 命令...
如果你做想用join
做这个,你有什么,稍微改变一下,应该是正确的:
index="orders" "Online order received" earliest=-9d latest=-8d
| rex field=message "paymentHashed=(?<payHash>.([a-z0-9_\.-]+))"
| stats values(_time) as onlineOrderTime by payHash
| join type=left payHash
[search index="orders" "Telesale order received" earliest=-20d latest=-5m
| rex field=message "paymentHashed=(?<payHash>.([a-z0-9_\.-]+))"
| rename timestamp as TeleSaleTime
| stats values(TeleSaleTime) by payHash ]
| rename timestamp as onlineOrderTime
请注意在子搜索中添加的 | stats values(...) by
:您需要确保已从列表中删除所有重复项,这样做就可以了。通过使用 values()
,您还可以确保 payHash
字段是否有重复的条目,它们会被组合在一起。 (同样,在子搜索之前添加了一个| stats values...
以加速整个操作。)
您也应该可以在没有 join
的情况下执行此操作:
index="orders" (("Online order received" earliest=-9d latest=-8d) OR "Telesale order received" earliest=-20d))
| rex field=_raw "(?<order_type>\w+) order received"
| rex field=message "paymentHashed=(?<payHash>.([a-z0-9_\.-]+))"
| stats values(order_type) as order_type values(_time) as orderTimes by payHash
| where mvcount(order_type)>1
确保时间正确后,您可以对其进行格式化 - 这是我经常使用的格式:
| eval onlineOrderTime=strftime(onlineOrderTime,"%c"), TeleSaleTime=strftime(TeleSaleTime,"%c")
您可能还需要做进一步的重新格式化,但这些应该会让您接近
fwiw - 我想知道为什么您要查看 9 天前的在线订单,但要查看 20 天前到现在的电话销售订单:但这就是我。
需求:我想查询一下,某一天使用的支付卡信息是否有使用相同支付卡信息下的电话销售订单。
我尝试了以下查询,它应该为我提供来自在线订单的所有支付卡信息和来自电话销售的匹配支付信息。但是我没有给出正确的结果,基本上结果显示没有电话销售的付款信息,但是当我搜索 splunk 时,我也发现了电话销售。所以查询错误。
index="orders" "Online order received" earliest=-9d latest=-8d
| rex field=message "paymentHashed=(?<payHash>.([a-z0-9_\.-]+))"
| rename timestamp as onlineOrderTime
| table payHash, onlineOrderTime
| join type=left payHash [search index="orders" "Telesale order received" earliest=-20d latest=-5m | rex field=message "paymentHashed=(?<payHash>.([a-z0-9_\.-]+))" | rename timestamp as TeleSaleTime | table payHash, TeleSaleTime]
| table payHash, onlineOrderTime, TeleSaleTime
请帮助我修正查询或找出满足我要求的结果的查询。
join
命令需要一个字段名称列表,每个搜索的事件将在这些字段名称上进行匹配。如果未列出任何字段,则使用所有字段。在该示例中,字段 'onlineOrderTime' 和 'TeleSaleTime' 仅存在于联接的一侧,因此无法进行匹配。解决方法很简单:指定公共字段名称。 ... | join type=left payHash ...
.
首先,您可以删除最后一行 | table payHash, onlineOrderTime, TeleSaleTime
,因为它什么都不做(连接命令已经连接了您创建的两个 table)。
其次,当 运行 两个查询分别进行时 - 两个查询具有相同的 "payHash"es?两个查询 return 返回 table 的真实结果?
因为从表面上看,您正确使用了 join 命令...
如果你做想用join
做这个,你有什么,稍微改变一下,应该是正确的:
index="orders" "Online order received" earliest=-9d latest=-8d
| rex field=message "paymentHashed=(?<payHash>.([a-z0-9_\.-]+))"
| stats values(_time) as onlineOrderTime by payHash
| join type=left payHash
[search index="orders" "Telesale order received" earliest=-20d latest=-5m
| rex field=message "paymentHashed=(?<payHash>.([a-z0-9_\.-]+))"
| rename timestamp as TeleSaleTime
| stats values(TeleSaleTime) by payHash ]
| rename timestamp as onlineOrderTime
请注意在子搜索中添加的 | stats values(...) by
:您需要确保已从列表中删除所有重复项,这样做就可以了。通过使用 values()
,您还可以确保 payHash
字段是否有重复的条目,它们会被组合在一起。 (同样,在子搜索之前添加了一个| stats values...
以加速整个操作。)
您也应该可以在没有 join
的情况下执行此操作:
index="orders" (("Online order received" earliest=-9d latest=-8d) OR "Telesale order received" earliest=-20d))
| rex field=_raw "(?<order_type>\w+) order received"
| rex field=message "paymentHashed=(?<payHash>.([a-z0-9_\.-]+))"
| stats values(order_type) as order_type values(_time) as orderTimes by payHash
| where mvcount(order_type)>1
确保时间正确后,您可以对其进行格式化 - 这是我经常使用的格式:
| eval onlineOrderTime=strftime(onlineOrderTime,"%c"), TeleSaleTime=strftime(TeleSaleTime,"%c")
您可能还需要做进一步的重新格式化,但这些应该会让您接近
fwiw - 我想知道为什么您要查看 9 天前的在线订单,但要查看 20 天前到现在的电话销售订单:但这就是我。