2017-01-25 3 views
1

У меня есть BigQuery Таблица с столбцом типа RECORD & режим REPEATED. Я должен запросить и использовать эту таблицу в таблице. Использование UNNEST или FLATTEN в BigQuery выполняет CROSS JOIN таблицы, которая влияет на производительность. Есть ли другой способ использовать эту таблицу в Таблица без сглаживания. Отправьте ссылку на схему схемы таблицы ниже.Доступ к BigQuery RECORD - Повторение в таблице

[Схема таблицы] https://i.stack.imgur.com/T4jHg.png

+0

Что вы пытаетесь сделать с этой колонкой? Какие вопросы вы пробовали до сих пор? –

+0

Мы пытаемся присоединиться к этой таблице с несколькими таблицами для предоставления данных в отчет Tableau. Производительность поражает это. – Safiyur

ответ

1

Есть ли другой способ использовать ...?

Вы не должны бояться UNNEST только потому, что он «не будет» CROSS JOIN
Хитрость заключается в том, что несмотря на то, что перекрестное соединение, но это перекрестное соединение в строке только и глобальными для всех строк в таблице. В то же время, всегда есть способ сделать вещи различных
Так, в приведенном ниже примере 1 - представляет фиктивный пример использования UNNEST
А потом Пример 2 - показывает, как сделать то же самое без использования UNNEST, а с помощью SQL UDF
Вы не представили специфику о вашем случае, поэтому ниже достаточно универсален, чтобы показать «других» способ

с Flattening via UNNEST

#standardSQL 
WITH yourTable AS (
    SELECT 1 AS id, ARRAY<STRUCT<details INT64, flag STRING, value STRING, description STRING>> 
    [(1,'y','a','xxx'),(2,'n','b','yyy'),(3,'y','c','zzz'),(4,'n','d','vvv')] AS type UNION ALL 
    SELECT 2 AS id, ARRAY<STRUCT<details INT64, flag STRING, value STRING, description STRING>> 
    [(11,'t','c','xxx'),(21,'n','a','yyy'),(31,'y','c','zzz'),(41,'f','d','vvv')] AS type 
) 
SELECT id, SUM(t.details) AS details 
FROM yourTable, UNNEST(type) AS t 
WHERE t.flag = 'y' 
GROUP BY id 

с SQL UDF

#standardSQL 
CREATE TEMP FUNCTION do_something (
    type ARRAY<STRUCT<details INT64, flag STRING, value STRING, description STRING>> 
) 
RETURNS INT64 AS ((
    SELECT SUM(t.details) AS details 
    FROM UNNEST(type) AS t 
    WHERE t.flag = 'y' 
)); 

WITH yourTable AS (
    SELECT 1 AS id, ARRAY<STRUCT<details INT64, flag STRING, value STRING, description STRING>> 
    [(1,'y','a','xxx'),(2,'n','b','yyy'),(3,'y','c','zzz'),(4,'n','d','vvv')] AS type UNION ALL 
    SELECT 2 AS id, ARRAY<STRUCT<details INT64, flag STRING, value STRING, description STRING>> 
    [(11,'t','c','xxx'),(21,'n','a','yyy'),(31,'y','c','zzz'),(41,'f','d','vvv')] AS type 
) 
SELECT id, do_something(type) AS details 
FROM yourTable 
+0

Большое спасибо за решение. Я также пробовал это решение. Просто мысль о том, будет ли более эффективный способ обработки повторяющихся полей. Может ли кто-нибудь предложить использовать прецедент для реальной необходимости повторных полей. Это будет очень полезно в нашем дизайне модели. благодаря – Safiyur

Смежные вопросы