聚合来自 JSON 类型值的值时无法创建 Google BigQuery 物化视图

问题描述 投票:0回答:1

我的 Firestore 数据库安装了 Google BigQuery 扩展,因此我们所有的数据最终都会存储在 Google 的 BigQuery 中。

我们的“raw_changelog”表的结构如下所示。

enter image description here

我的问题与

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`

但是我收到以下错误;

enter image description here

我发现错误与线路有关;

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 以及可能解决我的问题的方法吗?

google-bigquery materialized-views
1个回答
0
投票

物化视图有一个解决方法:请将

LEFT JOIN
替换为
,

对于物化视图,允许的计算量是有限制的。您的查询包含以下 4 个任务操作:

  • unnest
    -ing 一个 json 数组,包含一个对象
  • a
    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
结合使用。

© www.soinside.com 2019 - 2024. All rights reserved.