如何处理 Clickhouse 的聚合合并树物化视图中的嵌套字段?



有没有一种方法可以通过在AggregatedMergeTree实体化视图中的Clickhouse来组合(连接(组中的Nested字段?

想象一下,我有一个表,它的模式(简化(如下:

CREATE TABLE test
(
key1 String,
key2 String,
clicks Int32,
points Nested(x Int32, y Int32)
) Engine = Log

我希望能够使用CCD_ 3来生成物化视图;连接";它们(就好像嵌套的记录可以像某些SQL方言那样连接为复杂的值(。

如果我这样做作为一个查询,它是可能的:

SELECT 
key1,
key2,
arrayMap(p -> p.1, points) as x,
arrayMap(p -> p.2, points) as y
FROM
(
SELECT  
key1,
key2,
groupArray(tuple(x, y)) as points
FROM
(
SELECT 
key1, key2, points.x as x, points.y as y
FROM test 
ARRAY JOIN points
)
GROUP BY key1, key2
)

有没有一种方法可以在基于AggregatingMergeTree引擎的物化视图中使用的查询中表达这一点?我能想到的最好的东西是这样的:

CREATE MATERIALIZED VIEW testagg1
engine = AggregatingMergeTree partition by key1 order by (key1, key2)
AS 
SELECT
key1,
key2,
sumState(clicks) as clicks,
groupArrayState(points.x) as `points.x`,
groupArrayState(points.y) as `points.y`
FROM test
GROUP BY key1, key2

然后,我可以使用以下查询获得扁平表单:

SELECT 
arrayMap(p -> p.1, arrayZip(x, y)) as x1,
arrayMap(p -> p.2, arrayZip(x, y)) as y1
FROM
(
SELECT 
key1,
key2,
groupArrayMerge(`points.x`) as x, 
groupArrayMerge(`points.y`) as y 
FROM testagg1
GROUP BY key1, key2
) as points 
ARRAY JOIN x, y

它有效,但看起来有点复杂。

  • 有更简单更好的方法吗
  • 上面使用的groupArrayStategroupArrayMerge聚合是否保证保持并行阵列中x/y字段的相同顺序

Nested(x Int32,y Int32(--是create table命令减少数组样板的语法糖。

desc test
┌─name─────┬─type─────────┬
│ key1     │ String       │
│ key2     │ String       │
│ clicks   │ Int32        │
│ points.x │ Array(Int32) │
│ points.y │ Array(Int32) │
└──────────┴──────────────┴

我能想出的最好的办法是这样的:组ArrayState(points.x(作为CCD_ 8,groupArrayState(points.y(为points.y

这是唯一的方法。这是官方/正确的CH方式。

上面使用的

聚合保证保持相同并行数组中x/y字段的排序?

是的,它是有保证的。

SELECTarrayMap(p->p.1,arrayZip(x,y((作为x1,arrayMap(p->p.2,arrayZip(x,y((作为y1

它与相同

选择x,y

不是吗?

最新更新