我的 Firestore 数据库安装了 Google BigQuery 扩展,因此我们所有的数据最终都会存储在 Google 的 BigQuery 中。
我们的“raw_changelog”表的结构如下所示。
我的问题与
data
列(JSON 类型)有关,事实上我似乎无法在其上构建物化视图(MV)。
我想制作以下MV;
CREATE OR REPLACE MATERIALIZED VIEW `XXX.XXX.v_data`
PARTITION BY DATE(`published_at`)
CLUSTER BY `event_id`
OPTIONS (
enable_refresh=true,
refresh_interval_minutes=1
)
AS
SELECT
`published_at`,
`event_id`,
ARRAY_AGG(`tags_unnest`.`name` IGNORE NULLS) AS `tags`
FROM `XXX.XXX.XXX_raw_latest` AS `o`
LEFT JOIN UNNEST(JSON_QUERY_ARRAY(`data`.`tags`)) AS `tags_unnest`
WHERE
DATE(`o`.`published_at`) > '2021-01-01'
GROUP BY
`published_at`,
`event_id`
但是我收到以下错误;
我发现错误与线路有关;
ARRAY_AGG(`tags_unnest`.`name` IGNORE NULLS) AS `tags`
我验证了
tags_unnest
是对象类型(来自 JSON data
字段),看来问题来自于 tags_unnest
是我猜测的对象这一事实。
如果我将上面的行替换为;
ARRAY_AGG('aa' IGNORE NULLS) AS `tags`
或
ARRAY_AGG(`published_at` IGNORE NULLS) AS `tags`
然后就可以正常工作了,我可以继续创建 MV。
也许也值得一提;在源表中,如果我将
data
字段的类型更改为“STRING”,那么我原来的 create-MV-query 也可以毫无问题地运行..
谁能告诉我为什么我无法创建 MV 以及可能解决我的问题的方法吗?
物化视图有一个解决方法:请将
LEFT JOIN
替换为 ,
对于物化视图,允许的计算量是有限制的。您的查询包含以下 4 个任务操作:
unnest
-ing 一个 json 数组,包含一个对象left join
.name
或.x
)和array_agg
。如果少用一项操作,应该就可以了。将
left join
替换为 ,
让我们构建一个虚拟表:
CREATE OR REPLACE TABLE
Test.ajson AS
SELECT
1 published_at, 1 event_id, json ' {"a":[1],"tags":[{"x":1}]} ' AS DATA, [1,2] arr
UNION ALL SELECT 2, 2, json ' {"a":[2],"tags":[{"x":2},{"x":20}]} ', []
UNION ALL SELECT 1, 1, json ' {"tags":[{"x":10}]} ', []
现在构建 MV:
CREATE OR REPLACE MATERIALIZED VIEW `Test.ajsonview` as
SELECT
published_at,
event_id,
ARRAY_AGG(`tags_unnest`.`x` IGNORE NULLS) AS `tags`,
# ARRAY_AGG(`tags_unnest` IGNORE NULLS) AS testing
FROM Test.ajson
, # works
#left join # throws error: Incremental materialized view query contains unsupported feature.
UNNEST(JSON_QUERY_ARRAY(`data`.`tags`)) tags_unnest
WHERE published_at>0
group by 1,2
请注意,
ARRAY_AGG
没有 .x
:
ARRAY_AGG(`tags_unnest` IGNORE NULLS) AS testing
与
LEFT JOIN
结合使用。