【问题标题】:How to model array of key/value pairs如何建模键/值对数组
【发布时间】:2019-01-23 18:42:03
【问题描述】:

我们使用 ClickHouse 存储网页加载的内部性能指标。每个指标都包含一组键/值对,用于他们关心的自定义加载时间。我们希望将这些存储在 ClickHouse 中,并能够像查询任何其他时间值一样查询时间。

例如,当我获得一个指标以及所有标准数据时,我可能会获得一些数据,这些数据可以为我提供一堆自定义内容的加载时间,如下所示:

TimeStamp=1548268715
CustomEvents="a=10,b=20,c=30"

在这种情况下,我想以如下方式存储值 a=10b=20c=30

  1. 它仍然与原始数据相关联(因此我可以按时间戳、任何其他字段等进行过滤)。
  2. 我可以汇总和查询特定的“自定义事件”。例如,我可能想要对特定日期之间的所有 a 时间值进行直方图。

挑战在于我事先不知道存在哪些自定义事件。我想我可以将这些列入白名单,但它们的数量可能会变得非常大,并且自定义事件的基数非常高。

如果您对此有任何想法,我将不胜感激。我有一些想法,但不介意任何想法。

【问题讨论】:

  • 你看过嵌套结构吗?

标签: clickhouse


【解决方案1】:

ClickHouse 中的标准方法是使用嵌套结构并使用 ARRAY JOIN 从中选择。

ClickHouse 中的嵌套字段实际上是一组相同长度的数组。

示例:

  1. 这样创建表

    CREATE TABLE performance_metrics
    (
        timestamp DateTime, 
        website String, 
        custom_events Nested (
            metric String,
            value UInt64  -- actually you can have more attributes here, if needed
        )
    )
    ENGINE = MergeTree
    PARTITION BY toMonday(timestamp)
    ORDER BY (website, timestamp);
    
  2. 放置数据,将嵌套子字段引用为多个数组。这些数组的名称应以嵌套名称为前缀,并且长度应相同:

    INSERT INTO performance_metrics (timestamp, website, custom_events.metric, custom_events.value)  VALUES
    ( '2019-02-04 10:00:00', 'google.com',        ['a', 'b', 'c'],[10,20,30]),
    ( '2019-02-04 10:00:01', 'stackoverflow.com', ['b', 'c', 'd'],[22,29,40]),
    ( '2019-02-04 10:00:01', 'google.com',        ['a','d'], [8,42]);
    
  3. 现在您可以使用 ARRAY JOIN 从 performance_metrics 中进行选择:

    SELECT 
        website, 
        custom_events.metric, 
        median(custom_events.value), 
        min(timestamp), 
        max(timestamp)
    FROM performance_metrics 
    ARRAY JOIN custom_events
    GROUP BY 
        website, 
        custom_events.metric
    ORDER BY 
        website ASC, 
        custom_events.metric ASC
    

【讨论】:

  • 如果嵌套结构的数据类型未知,有没有办法做到这一点?
猜你喜欢
  • 2017-07-21
  • 1970-01-01
  • 2013-12-02
  • 2017-09-22
  • 2010-11-11
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
相关资源
最近更新 更多