Как запросить тип структуры в bigquery без «Шага имени поля не существует в STRUCT»?

#sql #struct #google-bigquery

#sql #структура #google-bigquery

Вопрос:

Когда я запускаю этот запрос в bigquery

 select jsonpayload.context.input.step
from `table_2019*`
  

ответить

«Шаг имени поля не существует в СТРУКТУРЕ в [1: 34]»

Однако при выполнении того же запроса для других таблиц, таких как table_20190101 или table_20190102, он работал нормально

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

Ответ №1:

Как я могу исправить свой код, чтобы показывать все результаты без ошибок? Проблема не в вашем коде SQL

Вы выполняете запрос к старому разделу, что означает, что физическая структура каждого раздела может отличаться. Судя по сообщению об ошибке, по крайней мере в 1 из этих разделов нет шага поля, в то время как в другом есть.

Вариант 1
Самый простой способ найти это — использовать WebUI для просмотра структуры разделов и найти пробел

введите описание изображения здесь

Вариант 2

Если вы подписаны на бета-версию INFORMATION_SCHEMA, вы можете запустить этот запрос, чтобы понять, в чем проблема:

 select * from `datasetId.INFORMATION_SCHEMA.COLUMNS`
where table_name like 'table%'
limit 100;
  

введите описание изображения здесь

В любом случае вы можете использовать функцию unnset для выбора из вашего поля STRUCT, например:

 WITH `table` AS (
SELECT (ARRAY<STRUCT<x INT64, y STRING>>[(1, 'foo'), (3, 'bar')]) as arr
)

select x, y from (
  select * from `table`, unnest(arr)
)
  

введите описание изображения здесь

Комментарии:

1. Привет, Тамир Кляйн, большое вам спасибо за ваш ответ. На самом деле я уже знаю, где проблема. моя проблема возникла из-за того, что в моем приложении сегодня нет события в этом поле, но мне нужно знать, как запустить SQL, чтобы игнорировать этот случай. Потому что мне нужно отслеживать событие каждые 1 час в моем расписании.

2. Вы пытались использовать unnest , как описано в этой ссылке: cloud.google.com/bigquery/docs/reference/standard-sql /…

3. Спасибо, Тамир Кляйн, я попробую ваш совет.

4. Конечно, я обновляю свой ответ, чтобы помочь вам еще немного. Пожалуйста, подумайте о принятии ответа и голосовании, если это было вам полезно, посмотрите, как в этой ссылке: meta.stackexchange.com/questions/5234 /…

5. Извините, это не работает, я пытаюсь выполнить запрос для получения этого столбца (jsonpayload.context.input.step), но события в этом разделе не происходит, что означает, что в этом разделе нет этого столбца, но я пытаюсь выбрать все (из table_2019* ), но в этом разделе ошибка. Если отправить мне null, это нормально, но отправьте мне сообщение об ошибке.