Вы правы, join здесь не поможет. Я обнаружил, что способ разворота информации в двух индексах состоит в том, чтобы начать с обоих индексов и манипулировать гетерогенными событиями, как если бы они были одним индексом.
В этом случае один подход использует streamstats для создания событий, которые денормализуются для включения соответствующих полей деятельности в каждое событие местоположения. Во-первых, убедитесь, что каждое событие из индекса A считает start_time полем _time
. Затем используйте streamstats
, чтобы заполнить каждое событие нулевыми start_time
, end_time
или activity
полями (которые должны поступать из индекса B) с последним значением для этого entity
, который был не нулевым (который должен поступать из индекса A). Наконец, отфильтруйте любые события, где _time
>end_time
, что было бы любым событием позиции, которое выходит за пределы окна активности.
index=A OR index=B
| eval _time=coalesce(start_time, _time)
| streamstats latest(start_time) as activity_start_time, latest(end_time) as activity_end_time, latest(activity) as activity by entity
| where _time<=end_time
Имейте в виду, что этот подход предполагает, что деятельность аккуратно упорядочены, так что никакая деятельность не перекрывает другую. Это было бы немного сложнее, если действия могут перекрываться.
Другой метод, который я иногда использую, заключается в использовании transaction вместо streamstats
. Это дает гораздо больший контроль над логикой, когда начинается и заканчивается одна активность, и приводит к одному событию за активность с многозначными полями для позиции. Вы хотите начать с одного поля «точка» для каждой позиции, если вы пройдете по этому маршруту.
Каково значение поля _time в A по отношению к start_time и end_time? В чем смысл поля _time в B? Ожидаете ли вы много строк в A и/или B с одинаковым значением объекта? –
_time в A на самом деле здесь незначительно, я ставлю его только потому, что у spunk всегда есть это поле. Важно то, как сравнить _time в B, чтобы начать время и время окончания в A – Gordon