繁体   English   中英

在 Bigquery 中创建物化视图时的左连接解决方法

[英]Left join workaround when creating materialized view in Bigquery

我在数据集下有两个表:BigQuery 中的my_dataset

  1. 事件表

在此处输入图像描述

  1. event_attributes 表

在此处输入图像描述

这些表下的数据是通过在 GCP 中运行的 Dataflow 作业填充的。

event_attributes表中,attribute_number 有 4 个不同的值:[1,2,3,4]。

对于给定的events_fk值, event_attributes表中最多可以有 4 行,即下面查询中的 all_count 的值最多可以是 4。

select events_fk, count(*) as all_count from events_attributes group by events_fk order by all_count limit 1

现在,我想创建一个物化视图,其中包含所有事件的计数、按时间、app、已完成、attribute_value(from event_attributes table)分组的已完成事件的计数(来自 events 表) 为此,我正在尝试使用以下查询

create materialized view my_dataset.test_mv as (
  select 
  extract(DATE FROM timestamp_seconds(epoch_seconds_utc)) as date,
  extract(HOUR FROM timestamp_seconds(epoch_seconds_utc)) as hour,
  app,
  completed,
  attribute_value,
  count(*) as all_count,
  sum(cast(completed as tinyint)) as completed_count
  from `my_dataset.events` c
  left join unnest(
    (
      select array_agg( struct(id, events_fk, attribute_number, attribute_value) ) as eattr
      from `my_dataset.event_attributes`
    )
  ) a
  on c.id = a.events_fk
  group by date, hour, app, completed, attribute_value
)

由于到目前为止,在创建物化视图时不支持左连接,因此我尝试使用 unnest() 并在其中提供一个数组 arguments 作为解决方法。 但是,bigquery 用以下错误抱怨这个

在此处输入图像描述

我猜这是因为我在 unnest() 下使用的子查询。

尝试创建物化视图的原因:我想使用创建的物化视图来构建不同的报告。

我的要求是——

  1. 必须组合两个不同表中的数据并使用结果表来创建物化视图。
  2. 为最终的物化视图计算考虑所有事件表行(如果我使用内部连接,则无法完成)。

我还想过在数据流阶段本身合并这两个表的数据。 但到目前为止,这将是一条漫长的道路。 从那以后,我将不得不考虑数据流工作的变化。

问题:在创建物化视图查询方面需要帮助。 如果无法查询,那么在这种情况下最好的做法是什么? 任何建议都会非常有帮助。

提前致谢!!

编辑:可以通过以下查询构建示例数据

create table my_dataset.events (
  id INTEGER,
  epoch_seconds_utc INTEGER,
  app STRING,
  engaged BOOLEAN,
  completed BOOLEAN
);

create table my_dataset.event_attributes (
  id INTEGER,
  events_fk INTEGER,
  attribute_number STRING,
  attribute_value STRING
)


-- POPULATE EVENTS DATA
insert into `my_dataset.events` values (435515, 1660807131, 'airtel', FALSE, FALSE);
insert into `my_dataset.events` values (435517, 1660807514, 'vodafone', FALSE, FALSE);
insert into `my_dataset.events` values (285111, 1607927586, 'telstra', FALSE, FALSE);
insert into `my_dataset.events` values (435051, 1649137598, 'healthways', FALSE, FALSE);
insert into `my_dataset.events` values (435017, 1649068151, 'tangoe', FALSE, FALSE);
insert into `my_dataset.events` values (435519, 1660821334, 'airtel', FALSE, FALSE);
insert into `my_dataset.events` values (703, 1589840471,    'vodafone', FALSE, FALSE);
insert into `my_dataset.events` values (1619, 1591014513, 'telstra', FALSE, FALSE);
insert into `my_dataset.events` values (783, 1589840537, 'tangoe', FALSE, FALSE);
insert into `my_dataset.events` values (20245, 1596825490, 'healthways', FALSE, FALSE);


-- POPULATE EVENT ATTRIBUTES DATA
insert into `my_dataset.event_attributes` values (6341, 435017, '1',    'In Progress');
insert into `my_dataset.event_attributes` values (6381, 435051, '1',    'In Progress');
insert into `my_dataset.event_attributes` values (5429, 285111, '1',    '9191919191');
insert into `my_dataset.event_attributes` values (5431, 285111, '2',    'Direct Connection');
insert into `my_dataset.event_attributes` values (5433, 285111, '3',    'English');
insert into `my_dataset.event_attributes` values (5435, 285111, '4',    'Covid');
insert into `my_dataset.event_attributes` values (7161, 435517, '3',    'English');
insert into `my_dataset.event_attributes` values (7159, 435517, '2',    'Some value');
insert into `my_dataset.event_attributes` values (7151, 435515, '2', 'Some value');
insert into `my_dataset.event_attributes` values (7163, 435517, '4',    'Default');
insert into `my_dataset.event_attributes` values (7157, 435517, '1',    '50000');
insert into `my_dataset.event_attributes` values (7149, 435515, '1',    '50000');
insert into `my_dataset.event_attributes` values (7153, 435515, '3',    'English');
insert into `my_dataset.event_attributes` values (7155, 435515, '4',    'Default');

在这种情况下,如果您使用类似的查询执行内部联接

select e.id, ea.attribute_number, ea.attribute_value 

from my_dataset.events e left join my_dataset.event_attributes ea on e.id=ea.events_fk

我得到大约 14 行,如果我在上面的查询中使用左连接,我得到大约 19 行,因为事件表中有记录在 event_attributes 中没有相应的条目。

Desired output:想要获取考虑创建物化视图的事件表的所有行。

如果我需要任何信息,请告诉我。

咨询了一位 Google 员工:

当写入源不如从源读取多时,材料视图很好,并且拥有预处理数据将节省时间或成本,或者当增量刷新将受益时。 [1]

如果不支持左连接,您可以考虑以下操作:

  • 将表非规范化为一张表:将两个源表合并为一张表将无需使用连接语句。
  • 使用计划查询使用用于物化视图的查询来创建新表:虽然此选项不会在每次从源读取数据时都运行查询,但这可能会导致数据过时。
  • 重新创建运行用于 Dataflow 作业内的物化视图的查询的表:虽然这不会导致数据陈旧,但这不支持增量刷新并且可能会有性能差异。

有关其他资源类型的比较,请参阅[2]。

[1] https://cloud.google.com/bigquery/docs/materialized-views-intro#use_cases

[2] https://cloud.google.com/bigquery/docs/materialized-views-intro#comparison

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM