0

我目前使用的是 druid-Incubating-0.16.0 版本。如https://druid.apache.org/docs/latest/tutorials/tutorial-update-data.html教程链接中所述,我们可以使用结合 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 步:我用 appendToExisting = false 和 rollUp = true 更新了 Tiger 的数据 {"timestamp":"2018-01-01T01:01:35Z","animal":"tiger", "number":30} 和找到了结果

┌──────────────────────────┬──────────┬───────┬────────┐
│ __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 步:现在我用 appendToExisting = false 和 rollUp = true 更新长颈鹿 {"timestamp":"2018-01-01T03:01:35Z","animal":"giraffe", "number":30} 并得到以下结果

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

在添加带有 appendToExisting = true 的新数据 {"timestamp":"2018-01-01T03:01:35Z","animal":"giraffe", "number":30} 时,我得到了

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

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

4

1 回答 1

2

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

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

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

这与“普通”数据库不同,您可以在其中更新特定行。

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

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

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

于 2019-12-02T15:35:50.147 回答