【问题标题】:Apache Druid : Issue while updating the data in DatasourceApache Druid:更新数据源中的数据时出现问题
【发布时间】:2019-12-02 04:18:17
【问题描述】:

我目前使用的是 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 更新 giraffe 并得到以下结果

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

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

【问题讨论】:

    标签: druid data-ingestion


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 请使用 ingestSegment firehose 检查更新说明。我必须按照您的建议编写 transformationSpec 吗?
    • “firehose”:{“type”:“combining”,“delegates”:[{“type”:“ingestSegment”,“dataSource”:“updates-tutorial”,“interval”:“ 2018-01-01/2018-01-03" }, { "type" : "local", "baseDir" : "quickstart/tutorial", "filter" : "updates-data3.json" } ] }
    • 没有发生汇总,因为您指定了 appendToExisting=true。汇总将应用于摄取的数据。然后这些将附加到您的数据中,这正是您在结果集中看到的内容。因此,如果您将“长颈鹿”数据添加到原始数据集中,您应该将appendToExisting 设置为false,这样整个数据集就会被您的新数据覆盖。您还可以使用appendToExisting=true 将“giraffe”记录推送到您的数据集。在这种情况下,将添加“giraffe”记录。
    • 是的。根据我的理解,保持 appendToExisting = true 将始终将数据附加到现有数据。汇总只会发生在即将摄取的数据集上。
    • 正确。因此,如果您添加这些:{"timestamp":"2018-01-01T03:01:10Z","animal":"giraffe", "number":30} {"timestamp":"2018-01-01T03:01:20Z","animal":"giraffe", "number":30} 并使用 rollUp=true,您的数据将与 number: 60 合并为 1 条记录
    猜你喜欢
    • 2021-11-20
    • 2011-05-12
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    相关资源
    最近更新 更多