如何为键/值对数组建模

时间:2019-01-23 18:42:04

标签: clickhouse

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

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

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

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

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

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

我对此表示感谢。我有一些想法,但是不介意任何想法。

1 个答案:

答案 0 :(得分: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