0

在表chrome-ux-report.all.201910和之前的表格中,我们有一个名为experimental.first_input_delay. 由于chrome-ux-report.all.201911相同的数据已重命名为first_input.delay.

在此更改之前,我使用通配符查询chrome-ux-report.all.*来聚合所有 YYYYMM 数据,但现在这些查询失败了,因为字段名称不同。我正在寻找可以容纳旧字段名称或新字段名称的修复程序。这是一个简化的示例:

SELECT
  COALESCE(first_input.delay.histogram.bin, experimental.first_input_delay.histogram.bin) AS fid
FROM
  `chrome-ux-report.all.*`

first_input_delay这会导致结构架构中不存在的错误experimental

错误:字段名称 first_input_delay 不存在于 STRUCT<time_to_first_byte STRUCT<histogram STRUCT<bin ARRAY<STRUCT<start INT64, end INT64, density FLOAT64>>>>>` at [2:58]

当然,对于通配符涵盖的某些表,该字段存在于该结构中,但其他表不存在。验证器似乎只查看最近的表。

所以我的问题是是否可以使用类似的东西COALESCE来容纳跨表重命名的字段?我知道架构使我们更难做到这一点,更好的解决方案是使用单个分区表,但我想知道这是否可以根据我们当前的设置解决。

4

3 回答 3

1

尝试为您的用户提供一个视图 - 起点可以是:

CREATE OR REPLACE VIEW `fh-bigquery.public_dump.chrome_ux_experimental_input_delay_view_202001`
AS
SELECT * EXCEPT(experimental)
  , experimental.first_input_delay.histogram.bin AS fid
  , CONCAT('2018', _table_suffix) ts
FROM `chrome-ux-report.all.2018*` 
UNION ALL
SELECT * EXCEPT(largest_contentful_paint,  experimental), experimental.first_input_delay.histogram.bin
  , CONCAT('20190', _table_suffix) ts
FROM `chrome-ux-report.all.20190*`  
UNION ALL
SELECT * EXCEPT(largest_contentful_paint,  experimental), experimental.first_input_delay.histogram.bin
  , '201910'
FROM `chrome-ux-report.all.201910`   
UNION ALL
SELECT * EXCEPT(largest_contentful_paint,  experimental, first_input, layout_instability), first_input.delay.histogram.bin
  , '201911'
FROM `chrome-ux-report.all.201911`   
UNION ALL
SELECT * EXCEPT(largest_contentful_paint,  experimental, first_input, layout_instability), first_input.delay.histogram.bin
  , '201912'
FROM `chrome-ux-report.all.201912`   

现在您的用户可以运行如下查询:

SELECT ts, origin, fid
FROM `fh-bigquery.public_dump.chrome_ux_experimental_input_delay_view_202001` 
LIMIT 10

在此处输入图像描述

Ps:这些表确实需要集群 -如果表是这样,这个查询将处理更少的字节。

于 2020-01-21T22:49:53.233 回答
0

尝试以下操作:

SELECT
  #Use coalesce for all the fields existing in the two tables#
  COALESCE(t1.first_input.delay.histogram.bin, t2.experimental.first_input_delay.histogram.bin) AS fid
FROM
(SELECT * FROM  `tables-with-old-field`) t1 FULL OUTER JOIN
(SELECT * FROM  `tables-with-new-field`) t2
ON t1.primary_key = t2.primary_key 

刚刚编辑了查询。请让我知道它是否有效

于 2020-01-06T23:22:39.100 回答
0

*通配符将表联合在一起,因此只有COALESCE一个或另一个可供使用。当您COALESCE使用两列作为参数调用时,它将失败。

您将希望以不同的方式处理每个模式,然后将它们合并。

with old_stuff as (
  -- Process the old data
  select some stuff
  from `chrome-ux-report.all.*`
  where _TABLE_SUFFIX <= '201910'
),
new_stuff as (
  -- Process the new data
  select and rename some stuff
  from `chrome-ux-report.all.*`
  where _TABLE_SUFFIX >= '201911'
),
unioned as (
  select * from old_stuff 
  union all 
  select * from new_stuff
)
select * from unioned

在每个 CTE 中根据需要选择、重命名和投射。

于 2020-01-07T00:14:43.577 回答