Использование Flatten для выбора, где var1 (без повторения) = abc из таблицы bigquery, содержащей несколько вложенных переменных?

Я новичок в BigQuery (3-й день использования без обучения), я просто пытаюсь разобраться во вложенных полях и т. Д.

Я просмотрел следующие ресурсы и использовал пример peopledata по ссылке google bigquery docs.

https://cloud.google.com/bigquery/docs/data

https://chartio.com/resources/tutorials/how-to-flatten-data-using-google-bigquerys-legacy-vs-standard-sql/

Я хочу выполнить следующий запрос:

select *
from [dataset.tableid]
where fullname = 'John Doe'

Если я запускаю это, я получаю следующую ошибку:

Ошибка: невозможно одновременно вывести несколько независимо повторяющихся полей. Найдено children_age и citiesLived_place

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

Полное имя | возраст | пол | Children.name | children.age

Джон Доу | 22 | Мужской | Джон | 5

Джон Доу | 22 | Мужской | Джейн | 7

В одной из вышеперечисленных статей предполагается, что вы все еще можете использовать операторы where с помощью функции flatten в bigquery:

select fullname,
age,
gender,
citiesLived.place
FROM (FLATTEN([dataset.tableId], children))
WHERE
(citiesLived.yearLived > 1995) AND
(children.age > 3)
GROUP BY fullName, age, gender, citiesLived.place

Если я изменю это на:

select *
FROM (FLATTEN([dataset.tableId], children))
WHERE fullname = 'John Doe'

Тогда это отлично работает и дает мне то, что мне нужно, однако, если я перейду на это:

select *
FROM (FLATTEN([dataset.tableId], citieslived))
WHERE fullname = 'John Doe'

Затем я получаю следующую ошибку:

Ошибка: невозможно одновременно вывести несколько независимо повторяющихся полей. Найдены children_age и городаLived_yearsLived

Может кто-нибудь объяснить, почему это сработает сглаживание на основе «Children», но не «CitiesLived», и как узнать, какие переменные использовать в сглаживании с более сложными наборами данных с несколькими вложенными переменными?

заранее спасибо


person Thomas Chamberlain    schedule 03.02.2017    source источник
comment
Есть ли причина попытаться сделать это с использованием устаревшего SQL? Вместо этого я бы предложил использовать стандартный SQL, поскольку он упрощает выражение преобразований на основе массивов.   -  person Elliott Brossard    schedule 03.02.2017
comment
Привет, Эллиотт, спасибо за быстрый ответ, извините, я даже не знал, что в bigquery было два диалекта SQL. Позвольте мне взглянуть на это, чтобы узнать о миграции и о том, почему мы используем устаревший язык. Если у вас есть указания по использованию стандартного SQL, дайте мне знать. Спасибо   -  person Thomas Chamberlain    schedule 03.02.2017


Ответы (2)


Может кто-нибудь объяснить, почему это будет работать с выравниванием на основе "Children", но не "CitiesLived"

Проверьте схему этой таблицы еще раз

                Schema                
  ----------------------------------- 
   |- kind: STRING                    
   |- fullName: STRING (required)
   |- age: INTEGER
   |- gender: STRING
   +- phoneNumber: RECORD
   |  |- areaCode: INTEGER
   |  |- number: INTEGER
   +- children: RECORD (repeated)
   |  |- name: STRING
   |  |- gender: STRING
   |  |- age: INTEGER
   +- citiesLived: RECORD (repeated)
   |  |- place: STRING
   |  +- yearsLived: INTEGER (repeated)

Как вы можете видеть - когда вы сглаживаете children повторяющуюся запись - единственная повторяющаяся запись, которая остается для вывода, - это citiesLived, и даже несмотря на то, что внутри нее есть еще одно повторяющееся поле - yearsLived, они не являются независимыми - таким образом BigQuery Legacy SQL может выводить результат

Теперь, когда вы сглаживаете с помощью citiesLived - в результате вы получаете два повторяющихся поля - children и yearsLived. Эти два параметра независимы, поэтому BigQuery Legacy SQL не может выдать такой результат.

как узнать, какие переменные использовать в Flatten с более сложными наборами данных с несколькими вложенными переменными?

Чтобы это заработало - вам нужно добавить еще одно сплющивание с (например) полем yearsLived. Что-то вроде ниже

FROM (FLATTEN(FLATTEN([dataset.tableId], citieslived), yearsLived))  

Добавление всех этих нескольких FLATTEN может стать обременительным, поэтому использование BigQuery Standard SQL - действительно правильный выбор!

См. Переход с устаревшего SQL на стандартный SQL BigQuery

person Mikhail Berlyant    schedule 03.02.2017
comment
Спасибо за быстрый ответ Михаил! Правильно ли я говорю, что если есть зависимые поля, связанные с полем, которое вы сглаживаете, вы должны указать и сгладить все эти зависимые поля? Я не знал, что в bigquery есть два диалекта SQL. Спасибо за совет! - person Thomas Chamberlain; 03.02.2017
comment
В устаревшем SQL нет проблем с выводом повторяющихся полей, если они зависимы. Вам нужно сгладить независимые. Но, тем не менее, лучший способ двигаться дальше - это перейти на BigQuery Standard SQL. У него гораздо лучший способ работы с записями. Взгляните на ARRAY, чтобы получить представление - cloud.google.com/ bigquery / docs / reference / standard-sql / array - person Mikhail Berlyant; 03.02.2017
comment
Спасибо за это, Михаил, я только что попытался использовать стандартный SQL для выбора одного из наших живых наборов данных bigquery, однако получаю следующую ошибку: Ошибка: Синтаксическая ошибка: Неожиданный литерал с плавающей запятой 8286363. at [2: 6]. Я не уверен, что вы сможете пролить свет на эту ошибку, но я предполагаю, что это потому, что мы назвали наш набор данных 8286363, а bigquery может обрабатывать только наборы данных, начинающиеся с символов? - person Thomas Chamberlain; 03.02.2017
comment
Вы должны опубликовать новый вопрос с конкретной проблемой, которая у вас есть, чтобы мы смогли на нее ответить. Комментарии не позволяют эффективно отвечать, и SO на самом деле не так. это скорее сайт вопросов / ответов, а не дискуссионный форум. Так задайте новый вопрос. А пока возьмите один ответ и примите его, если он ответил вам на текущий вопрос. надеюсь, это имеет для вас смысл: o) - person Mikhail Berlyant; 03.02.2017
comment
тем временем - я думаю, ваше предположение верное - вы можете проверить больше здесь, cloud. google.com/bigquery/docs/reference/standard-sql/lexical - person Mikhail Berlyant; 03.02.2017
comment
Привет, Михаил, извини, я тоже впервые использую SO, вспомню об этом в следующий раз, спасибо за твою помощь. - person Thomas Chamberlain; 06.02.2017
comment
@ThomasChamberlain - на SO Thank you лучше всего выражать свое мнение путем голосования за полезный (-ые) ответ (-ов) и принятия самого полезного! - person Mikhail Berlyant; 07.02.2017

Если вы запустите этот запрос:

SELECT
*
FROM
(FLATTEN((FLATTEN(([project_id:dataset_id.table]), citiesLived.yearsLived)), citiesLived))

Как и ожидалось, он сгладится.

При использовании устаревшего SQL BQ пытается автоматически сгладить результаты за вас.

Однако я заметил, что если вы попытаетесь сгладить повторяющиеся поля, внутри которых есть другие повторяющиеся поля, то иногда вы можете столкнуться с этими ошибками (обратите внимание, что поля citiesLived и citiesLived.yearsLived повторяются).

Итак, один из способов решить эту проблему - принудительно выполнить операцию сглаживания для всех повторяющихся полей, с которыми вы хотите работать (в примере, который я вам показал, я сначала сгладил yearsLived, а затем citiesLived ) и не полагаться на автоматическую операцию выравнивания, которую предлагает Legacy SQL.

Но я настоятельно рекомендую и рекомендую вам изучить версию Standard SQL для BQ, как предложил Эллиот в своем комментарии. Сначала у него может быть более крутая кривая обучения, но в конечном итоге он полностью окупится (и у вас не будет риска в конечном итоге перенести все ваши устаревшие запросы на стандартные, как нам пришлось сделать в нашей компании)

person Willian Fuks    schedule 03.02.2017
comment
Спасибо за совет. Уилл, я не знал, что SQL имеет два диалекта в bigquery. Я подробнее рассмотрю переход на стандартный SQL. - person Thomas Chamberlain; 03.02.2017