Apache Druid:更新数据源中的数据时出现问题

Apache Druid : Issue while updating the data in Datasource

我目前使用的是druid-Incubating-0.16.0版本。正如 https://druid.apache.org/docs/latest/tutorials/tutorial-update-data.html 教程 link 中提到的,我们可以使用组合 firehose 来更新和合并数据源的数据。

步骤: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 步中老虎没有变化,而且数量也没有变化

仅供参考,count 和 number 是 metricSpec,它们分别是 count 和 longSum。 请澄清。


将 ingestSegment firehose 与初始数据一起使用时

┌──────────────────────────┬──────────┬───────┬────────┐
│ __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 │
└──────────────────────────┴──────────┴───────┴────────┘

它是正确的和预期的输出吗?为什么汇总没有发生?

德鲁伊实际上只有两种模式。覆盖或追加。

使用 appendToExisting=true,您的数据将附加到现有数据,这将导致 "number" 字段增加(计数也会增加)。

appendToExisting=false 段中的所有数据都将被覆盖。我认为这就是正在发生的事情。

这与 "normal" 数据库不同,您可以在其中更新特定行。

在德鲁伊中,你可以只更新某些行,但这是通过重新索引你的数据来完成的。这不是一个很容易的过程。 此重新索引由 ingestSegment Firehose 完成,它从一个段读取数据,然后将其也写入一个段(可以是相同的)。在此过程中,您可以添加一个转换过滤器,它会执行特定操作,例如更新某些字段值。

我们构建了一个 PHP 库来使这些过程更易于使用。请参阅此示例,了解如何重新索引段并在重新索引期间应用转换。

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