我们正在使用ClickHouse存储网页加载的内部效果指标。每个指标包含一组键/值对,用于它们关心的自定义加载时间。我们希望将它们存储在ClickHouse中,并能够像其他任何时间值一样查询时间。
例如,当我获得一个指标以及所有标准数据时,我可能拥有的数据可以为我提供一堆自定义内容的加载时间,例如:
TimeStamp=1548268715
CustomEvents="a=10,b=20,c=30"
在这种情况下,我想以以下方式存储值a=10
,b=20
和c=30
:
a
时间值进行直方图绘制。面临的挑战是我事先不知道存在哪些自定义事件。我想我可以将它们列入白名单,但是它们的数量可能会很大,并且自定义事件的基数很高。
我对此表示感谢。我有一些想法,但是不介意任何想法。
答案 0 :(得分:1)
ClickHouse中的标准方法是使用嵌套结构,然后使用ARRAY JOIN从中选择。
ClickHouse的底层嵌套字段只是一组长度相同的数组。
示例:
像这样创建表
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);
放入数据,将嵌套子字段引用为多个数组。这些数组的名称应以嵌套名称作为前缀,并且长度应相同:
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]);
现在您可以使用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