2017-02-03 21 views
2

Я довольно новичок в BigQuery (3-й день использования этого без обучения), я просто пытаюсь размахивать вокруг вложенных полей и т. Д.С помощью Flatten выберите, где var1 (не повторяется) = "abc" из таблицы bigquery, которая содержит несколько вложенных переменных?

Я рассмотрел следующие ресурсы и использовал данные peopledata пример на BigQuery DOCS ссылке Google

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

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

FULLNAME | возраст | пол | Children.name | children.age

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

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

Одно из указанных выше статей говорят о том, что вы все еще можете использовать операторы с помощью функции Свести в 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' 

Затем я получаю f ошибка ополнения:

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

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

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

+0

Есть ли причина попытаться сделать это с использованием устаревшего SQL? Вместо этого я бы предложил использовать стандартный SQL, поскольку упрощает его преобразование на основе массива. –

+0

Привет Эллиот, спасибо за ваш быстрый ответ, извините, я даже не знал, что у bigquery были два SQL-диалекта. Позвольте мне взглянуть на это, чтобы узнать о миграции и почему мы используем устаревший язык. Если у вас есть указатели на использование стандартного SQL, то, пожалуйста, дайте мне знать. Спасибо –

ответ

1

Can someone explain why this will work flattening based on "Children" but not "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 не может выводить такой результат.

how to know what variables to use within flatten with more complex datasets with multiple nested variables?

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

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

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

См Migrating from Legacy SQL в BigQuery Standard SQL

+0

Спасибо за ваш быстрый ответ Михаил!Правильно ли я говорю, что если есть зависимые поля, связанные с полем, которое вы выравниваете, вам нужно указать и сгладить все эти зависимые поля? Я не знал, что в bigquery есть два диалекта SQL. Спасибо за совет! –

+0

У устаревшего SQL нет проблем с выводом повторяющихся полей, если они зависят. Вам нужно сгладить те, которые независимы. Но, по-прежнему - лучший способ перейти отсюда - это перейти на BigQuery Standard SQL. Он имеет гораздо лучший способ работы с записями. Взгляните на ARRAYs, чтобы получить представление - https://cloud.google.com/bigquery/docs/reference/standard-sql/arrays –

+0

Спасибо за это Михаил, я только что попробовал использовать стандартный SQL для выбора из одного из нашего набора данных live bigquery, однако я получаю следующую ошибку: Ошибка: Синтаксическая ошибка: Неожиданный литерал с плавающей запятой «8286363.» в [2: 6]. Я не уверен, что вы сможете пролить свет на эту ошибку, но я предполагаю, что это потому, что мы назвали наш набор данных «8286363», а bigquery может обрабатывать только наборы данных, которые начинаются с символов? –

0

Если запустить этот запрос:

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

Это будет сглаживаться, как и ожидалось.

При использовании Legacy SQL BQ пытается получить flatten automatically результаты для вас.

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

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

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

+0

Спасибо за совет, я не понимал, что SQL имеет два диалекта в bigquery. Я еще раз рассмотрю переход на стандартный SQL. –