使用 AggregatingMergeTree 引擎的物化视图删除条目而不是聚合
Materialized view with AggregatingMergeTree engine removes entries instead of aggregation
假设我有以下 table
CREATE TABLE trades (
`ts` DateTime64(9, 'UTC'),
`volume` Decimal(40, 20),
`market` String
) ENGINE = MergeTree ORDER BY (market, ts)
以及其上的物化视图
CREATE MATERIALIZED VIEW trades_per_hour
ENGINE = AggregatingMergeTree()
ORDER BY (market, ts_1h)
AS (
SELECT sum(volume) as volume, ts_1h, market
FROM trades
GROUP BY market, toStartOfHour(ts) as ts_1h
)
我在那里插入几条记录:
INSERT INTO trades (*) VALUES ('2021-01-01 01:08:00', '1.5', 'EUR')
INSERT INTO trades (*) VALUES ('2021-01-01 01:09:00', '3.7', 'EUR')
所以 table 看起来像
┌────────────────────────────ts─┬─────────────────volume─┬─market─┐
│ 2021-01-01 01:08:00.000000000 │ 1.50000000000000000000 │ EUR │
└───────────────────────────────┴────────────────────────┴────────┘
┌────────────────────────────ts─┬─────────────────volume─┬─market─┐
│ 2021-01-01 01:09:00.000000000 │ 3.70000000000000000000 │ EUR │
└───────────────────────────────┴────────────────────────┴────────┘
现在,没有分组依据的物化视图显示两行(我想这是预期的):
SELECT * FROM trades_per_hour;
┌─────────────────volume─┬───────────────ts_1h─┬─market─┐
│ 3.70000000000000000000 │ 2021-01-01 01:00:00 │ EUR │
└────────────────────────┴─────────────────────┴────────┘
┌─────────────────volume─┬───────────────ts_1h─┬─market─┐
│ 1.50000000000000000000 │ 2021-01-01 01:00:00 │ EUR │
└────────────────────────┴─────────────────────┴────────┘
如果用组子句查询,则显示:
SELECT sum(volume), ts_1h FROM trades_per_hour GROUP BY ts_1h;
┌────────────sum(volume)─┬───────────────ts_1h─┐
│ 5.20000000000000000000 │ 2021-01-01 01:00:00 │
└────────────────────────┴─────────────────────┘
那么,如果我这样做
OPTIMIZE TABLE trades_per_hour;
我只剩下一行(我猜是因为重复数据删除?):
┌─────────────────volume─┬───────────────ts_1h─┬─market─┐
│ 1.50000000000000000000 │ 2021-01-01 01:00:00 │ EUR │
└────────────────────────┴─────────────────────┴────────┘
所以刚刚删除了卷 3.7 的行。
我真正期待的是
┌─────────────────volume─┬───────────────ts_1h─┬─market─┐
│ 5.20000000000000000000 │ 2021-01-01 01:00:00 │ EUR │
└────────────────────────┴─────────────────────┴────────┘
所以每个 ts_1h + 市场的“重复”实际上聚合在一起。
我想问一下我的 table and/or 物化视图定义有什么问题。
非常感谢任何帮助。
干杯。
需要使用AggregateFunction/SimpleAggregateFunction:
CREATE MATERIALIZED VIEW trades_per_hour
(
ts_1h DateTime64(9, 'UTC'),
volume SimpleAggregateFunction(sum, Decimal(40, 20)),
market String
)
ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMM(ts_1h)
ORDER BY (market, ts_1h)
AS
SELECT toStartOfHour(ts) as ts_1h, sum(volume) as volume, market
FROM trades
GROUP BY market, ts_1h
假设我有以下 table
CREATE TABLE trades (
`ts` DateTime64(9, 'UTC'),
`volume` Decimal(40, 20),
`market` String
) ENGINE = MergeTree ORDER BY (market, ts)
以及其上的物化视图
CREATE MATERIALIZED VIEW trades_per_hour
ENGINE = AggregatingMergeTree()
ORDER BY (market, ts_1h)
AS (
SELECT sum(volume) as volume, ts_1h, market
FROM trades
GROUP BY market, toStartOfHour(ts) as ts_1h
)
我在那里插入几条记录:
INSERT INTO trades (*) VALUES ('2021-01-01 01:08:00', '1.5', 'EUR')
INSERT INTO trades (*) VALUES ('2021-01-01 01:09:00', '3.7', 'EUR')
所以 table 看起来像
┌────────────────────────────ts─┬─────────────────volume─┬─market─┐
│ 2021-01-01 01:08:00.000000000 │ 1.50000000000000000000 │ EUR │
└───────────────────────────────┴────────────────────────┴────────┘
┌────────────────────────────ts─┬─────────────────volume─┬─market─┐
│ 2021-01-01 01:09:00.000000000 │ 3.70000000000000000000 │ EUR │
└───────────────────────────────┴────────────────────────┴────────┘
现在,没有分组依据的物化视图显示两行(我想这是预期的):
SELECT * FROM trades_per_hour;
┌─────────────────volume─┬───────────────ts_1h─┬─market─┐
│ 3.70000000000000000000 │ 2021-01-01 01:00:00 │ EUR │
└────────────────────────┴─────────────────────┴────────┘
┌─────────────────volume─┬───────────────ts_1h─┬─market─┐
│ 1.50000000000000000000 │ 2021-01-01 01:00:00 │ EUR │
└────────────────────────┴─────────────────────┴────────┘
如果用组子句查询,则显示:
SELECT sum(volume), ts_1h FROM trades_per_hour GROUP BY ts_1h;
┌────────────sum(volume)─┬───────────────ts_1h─┐
│ 5.20000000000000000000 │ 2021-01-01 01:00:00 │
└────────────────────────┴─────────────────────┘
那么,如果我这样做
OPTIMIZE TABLE trades_per_hour;
我只剩下一行(我猜是因为重复数据删除?):
┌─────────────────volume─┬───────────────ts_1h─┬─market─┐
│ 1.50000000000000000000 │ 2021-01-01 01:00:00 │ EUR │
└────────────────────────┴─────────────────────┴────────┘
所以刚刚删除了卷 3.7 的行。
我真正期待的是
┌─────────────────volume─┬───────────────ts_1h─┬─market─┐
│ 5.20000000000000000000 │ 2021-01-01 01:00:00 │ EUR │
└────────────────────────┴─────────────────────┴────────┘
所以每个 ts_1h + 市场的“重复”实际上聚合在一起。
我想问一下我的 table and/or 物化视图定义有什么问题。
非常感谢任何帮助。 干杯。
需要使用AggregateFunction/SimpleAggregateFunction:
CREATE MATERIALIZED VIEW trades_per_hour
(
ts_1h DateTime64(9, 'UTC'),
volume SimpleAggregateFunction(sum, Decimal(40, 20)),
market String
)
ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMM(ts_1h)
ORDER BY (market, ts_1h)
AS
SELECT toStartOfHour(ts) as ts_1h, sum(volume) as volume, market
FROM trades
GROUP BY market, ts_1h