Apache Druid: проблема при обновлении данных в источнике данных - PullRequest
0 голосов
/ 02 декабря 2019

В настоящее время я использую версию druid-Incubating-0.16.0. Как упомянуто в https://druid.apache.org/docs/latest/tutorials/tutorial-update-data.html учебной ссылке, мы можем использовать комбинированный пожарный шланг для обновления и объединения данных для источника данных.

Шаг: 1 Я использую те же примеры данных с исходной структурой, что и

┌──────────────────────────┬──────────┬───────┬────────┐
│ __time                   │ animal   │ count │ number │
├──────────────────────────┼──────────┼───────┼────────┤
│ 2018-01-01T01:01:00.000Z │ tiger    │     1 │    100 │
│ 2018-01-01T03:01:00.000Z │ aardvark │     1 │     42 │
│ 2018-01-01T03:01:00.000Z │ giraffe  │     1 │  14124 │
└──────────────────────────┴──────────┴───────┴────────┘

Шаг 2. Я обновил данные для тигра с помощью {"отметка времени": "2018-01-01T01: 01: 35Z", "животное": "тигр", "число": 30} с помощьюappendToExisting = false и rollUp = true и нашли результат

┌──────────────────────────┬──────────┬───────┬────────┐
│ __time                   │ animal   │ count │ number │
├──────────────────────────┼──────────┼───────┼────────┤
│ 2018-01-01T01:01:00.000Z │ tiger    │     2 │    130 │
│ 2018-01-01T03:01:00.000Z │ aardvark │     1 │     42 │
│ 2018-01-01T03:01:00.000Z │ giraffe  │     1 │  14124 │
└──────────────────────────┴──────────┴───────┴────────┘

Шаг 3: Теперь я обновляю жирафа с помощью {"timestamp": "2018-01-01T03: 01: 35Z", "animal":"giraffe", "number": 30} с appendToExisting = false и rollUp = true и получают следующий результат

┌──────────────────────────┬──────────┬───────┬────────┐
│ __time                   │ animal   │ count │ number │
├──────────────────────────┼──────────┼───────┼────────┤
│ 2018-01-01T01:01:00.000Z │ tiger    │     1 │    130 │
│ 2018-01-01T03:01:00.000Z │ aardvark │     1 │     42 │
│ 2018-01-01T03:01:00.000Z │ giraffe  │     2 │  14154 │
└──────────────────────────┴──────────┴───────┴────────┘

Я сомневаюсь, что на шаге 3 количество тигров уменьшается на 1, ноЯ думаю, что это не должно быть изменено, так как нет никаких изменений в шаге 3 для тигра, и нет никакого изменения числа также

К вашему сведению, count и number являются metricSpec, и они являются count и longSum соответственно. Пожалуйста, уточните.


при использовании пожарного рукава ingestSegment с начальными данными, такими как

┌──────────────────────────┬──────────┬───────┬────────┐
│ __time                   │ animal   │ count │ number │
├──────────────────────────┼──────────┼───────┼────────┤
│ 2018-01-01T00:00:00.000Z │ aardvark │     1 │   9999 │
│ 2018-01-01T00:00:00.000Z │ bear     │     1 │    111 │
│ 2018-01-01T00:00:00.000Z │ lion     │     2 │    200 │
└──────────────────────────┴──────────┴───────┴────────┘

при добавлении новых данных {"отметка времени": "2018-01-01T03: 01: 35Z", "animal": "giraffe", "number": 30} with appendToExisting = true, я получаю

┌──────────────────────────┬──────────┬───────┬────────┐
│ __time                   │ animal   │ count │ number │
├──────────────────────────┼──────────┼───────┼────────┤
│ 2018-01-01T00:00:00.000Z │ aardvark │     1 │   9999 │
│ 2018-01-01T00:00:00.000Z │ bear     │     1 │    111 │
│ 2018-01-01T00:00:00.000Z │ lion     │     2 │    200 │
│ 2018-01-01T00:00:00.000Z │ aardvark │     1 │   9999 │
│ 2018-01-01T00:00:00.000Z │ bear     │     1 │    111 │
│ 2018-01-01T00:00:00.000Z │ giraffe  │     1 │     30 │
│ 2018-01-01T00:00:00.000Z │ lion     │     1 │    200 │
└──────────────────────────┴──────────┴───────┴────────┘

это правильный и ожидаемый результат? почему свертка не произошла?

1 Ответ

1 голос
/ 02 декабря 2019

Друид на самом деле имеет только 2 режима. Перезаписать или добавить.

С помощью appendToExisting=true ваши данные будут добавлены к существующим данным, что приведет к увеличению поля «число» (и подсчет также).

С appendToExisting=falseвсе ваши данные в сегменте перезаписываются. Я думаю, что это то, что происходит.

Это отличается от «обычных» баз данных, где вы можете обновить определенные строки.

В друиде вы можете обновить только определенные строки, но это делается путем повторной индексации ваших данных. Это не очень легкий процесс. Эта переиндексация выполняется с помощью ingestSegment Firehose, который считывает ваши данные из сегмента, а затем записывает их также в сегмент (может быть таким же). Во время этого процесса вы можете добавить фильтр преобразования, который выполняет определенное действие, например, обновляет определенные значения полей.

Мы создали библиотеку PHP, чтобы с этими процессами было проще работать. Посмотрите этот пример, как переиндексировать сегмент и применить преобразование во время переиндексации.

https://github.com/level23/druid-client#reindex

...