Apache Druid: проблема при обновлении данных в источнике данных

В настоящее время я использую версию 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. Я обновил данные для тигра с помощью {"timestamp": "2018-01-01T01: 01: 35Z", "animal": "tiger", "number": 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 нет изменений для тигра, а также нет изменения номера

FYI, 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 │
└──────────────────────────┴──────────┴───────┴────────┘

при добавлении новых данных {"timestamp": "2018-01-01T03: 01: 35Z", "animal": "giraffe", "number": 30} с 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 │
└──────────────────────────┴──────────┴───────┴────────┘

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


person theNextBigThing    schedule 02.12.2019    source источник


Ответы (1)


У Друида на самом деле всего 2 режима. Заменить или добавить.

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

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

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

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

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

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

person 58k723f1    schedule 02.12.2019
comment
Пожалуйста, проверьте описание обновления с помощью шланга ingestSegment. Должен ли я написать спецификацию преобразования, как вы предложили? - person theNextBigThing; 03.12.2019
comment
firehose: {тип: объединение, делегаты: [{type: ingestSegment, dataSource: updates-tutorial, interval: 2018-01-01 / 2018-01-03}, {type: local, baseDir: quickstart / tutorial, filter: updates -data3.json}]} - person theNextBigThing; 03.12.2019
comment
Накопление не произошло, поскольку вы указали appendToExisting=true. Накопление будет применено к полученным данным. Затем они будут добавлены к вашим данным, что вы и видите в наборе результатов. Поэтому, если вы добавляете данные жирафа в исходный набор данных, вы должны установить appendToExisting на false, чтобы весь набор данных был перезаписан вашими новыми данными. Вы также можете только отправить запись жирафа в свой набор данных с помощью appendToExisting=true. В этом случае запись жирафа будет добавлена. - person 58k723f1; 03.12.2019
comment
да. Насколько я понимаю, сохранение appendToExisting = true всегда будет добавлять данные к существующим. Объединение будет выполнено только для набора данных, который готовится к загрузке. - person theNextBigThing; 03.12.2019
comment
Верный. Итак, если вы добавите эти: {"timestamp":"2018-01-01T03:01:10Z","animal":"giraffe", "number":30} {"timestamp":"2018-01-01T03:01:20Z","animal":"giraffe", "number":30} и используете rollUp=true, ваши данные будут объединены как 1 запись с number: 60 - person 58k723f1; 03.12.2019
comment
да. Я наблюдал то же самое. - person theNextBigThing; 04.12.2019