BigQuery COALESCE для синонимичных структур в запросе с подстановочными знаками - PullRequest
0 голосов
/ 07 января 2020

В таблице chrome-ux-report.all.201910 и ранее у нас было поле с именем experimental.first_input_delay. Начиная с chrome-ux-report.all.201911 те же данные были переименованы в first_input.delay.

До этого изменения я использовал групповые запросы, например chrome-ux-report.all.*, для агрегирования всех данных ГГГГММ, но теперь эти запросы не выполняются, потому что имя поля другое. Я ищу исправление, которое может вместить либо старые, либо новые имена полей. Вот упрощенный пример:

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 >>>> `at [2:58]

Конечно, в этой структуре существует поле для некоторых таблиц, охватываемых подстановочным знаком, но не для других. Кажется, валидатор просматривает только самые последние таблицы.

Так что мой вопрос: возможно ли использовать что-то вроде COALESCE для размещения поля, которое переименовывается в таблицах? Я понимаю, что схема усложняет нам эту задачу, и лучшее решение - это использовать одну многораздельную таблицу, но я хотел бы услышать, можно ли это решить, учитывая нашу текущую настройку.

Ответы [ 3 ]

1 голос
/ 22 января 2020

Попробуйте предложить своим пользователям представление - отправной точкой может быть:

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

enter image description here

Ps: эти таблицы действительно нужно кластеризовать - этот запрос обработал бы значительно меньше байтов , если бы таблицы были такими.

0 голосов
/ 07 января 2020

Таблицы объединений подстановочных знаков * объединены вместе, поэтому 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.

0 голосов
/ 07 января 2020

Попробуйте следующее:

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 

Только что отредактировал запрос. Пожалуйста, дайте мне знать, если это работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...