[英]Left join workaround when creating materialized view in Bigquery
我在数据集下有两个表:BigQuery 中的my_dataset
这些表下的数据是通过在 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() 下使用的子查询。
尝试创建物化视图的原因:我想使用创建的物化视图来构建不同的报告。
我的要求是——
我还想过在数据流阶段本身合并这两个表的数据。 但到目前为止,这将是一条漫长的道路。 从那以后,我将不得不考虑数据流工作的变化。
问题:在创建物化视图查询方面需要帮助。 如果无法查询,那么在这种情况下最好的做法是什么? 任何建议都会非常有帮助。
提前致谢!!
编辑:可以通过以下查询构建示例数据
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]
如果不支持左连接,您可以考虑以下操作:
有关其他资源类型的比较,请参阅[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.