Запросы на Bigquery повторные поля - PullRequest
0 голосов
/ 11 октября 2018

Ниже приведена схема моей таблицы BigQuery.Я выбираю предложение, хранилище и BU_model и вставляю данные в другую таблицу в BigQuery.Типы данных для новой сгенерированной таблицы являются целочисленными, повторяются и повторяются соответственно.Я хочу сгладить / развернуть повторяющиеся поля, чтобы они создавались как поля STRING во второй таблице.Как этого достичь, используя стандартный sql?

+- sentences: record (repeated)
|  |- sentence_id: integer                                                                                                                             
|  |- autodetected_language: string                                                                                                                    
|  |- processed_language: string 
|  +- attributes: record
|  |  |- agent_rating: integer
|  |  |- store: string (repeated)
|  +- classifications: record
|  |  |- BU_Model: string (repeated)

Запрос, который я использую для создания второй таблицы, выглядит следующим образом.Я хотел бы запросить BU_Model в виде столбца STRING.

SELECT sentence_id ,a.attributes.store,a.classifications.BU_Model
FROM staging_table , unnest(sentences) a

Ожидаемый результат должен выглядеть следующим образом:

Промежуточный стол:

41783851    regions     Apparel
            district    Footwear
12864656    regions
            district

Таблица конечных целей:

41783851    regions     Apparel
41783851    regions     Footwear            
41783851    district    Apparel
41783851    district    Footwear
12864656    regions
12864656    district    

Я попытался выполнить приведенный ниже запрос, и он, кажется, работает, как и ожидалось, но это означает, что мне нужно будет развернуть каждое ожидаемое повторяющееся поле.Моя таблица в Bigquery содержит более 50 столбцов, которые повторяются.Есть ли более простой способ обойти это?

SELECT
sentence_id,
flattened_stores,
flattened_Model
FROM `staging`  
left join unnest(sentences) a
left join unnest(a.attributes.store) as flattened_stores
left join unnest(a.classifications.BU_Model) as flattened_Model

1 Ответ

0 голосов
/ 11 октября 2018

Если вы хотите, чтобы в выводе оставалось еще три столбца - с массивами, уплощенными в строку

SELECT sentence_id , 
  ARRAY_TO_STRING(a.attributes.store, ',') store,
  ARRAY_TO_STRING(a.classifications.BU_Model, ',') BU_Model
FROM staging_table , unnest(sentences) a  

ОБНОВЛЕНИЕ для учета последних изменений в вопросе

В BigQuery StandardSQL - использование LEFT JOIN UNNEST() (как вы делали в последнем запросе) - наиболее разумный способ сделать то, что вы хотите получить в результате

В BigQuery Legacy SQL - вы можете использовать синтаксис FLATTEN -но у него есть один и тот же недостаток - необходимость повторять одно и то же для всех столбцов 50+

Очень упрощенный пример:

#legacySQL
SELECT sentence_id, store, BU_Model
FROM (FLATTEN([project:dataset.stage], BU_Model))  

Вывод: я бы пошел с LEFT JOIN UNNEST() подходом

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