2016-01-11 12 views
5

Czy w BigQuery można utworzyć kolumnę powtarzalnych rekordów? Na przykład dla następujących danych:BigQuery creat powtórzone pole rekordu z zapytania

| a | b | c | 
------------- 
| 1 | 5 | 2 | 
------------- 
| 1 | 3 | 1 | 
------------- 
| 2 | 2 | 1 | 

Czy jest możliwe?

Select a, NEST(b, c) as d from *table* group by a 

Aby produkować następujące wyniki

| a | d.b | d.c | 
----------------- 
| 1 | 5 | 2 | 
----------------- 
| | 3 | 1 | 
----------------- 
| 2 | 2 | 1 | 
+0

Jak ty - Jestem stosunkowo nowego użytkownika do SO (tu tylko kilka miesięcy), więc nadal nauki pewne zasady wokół niego - chciałem podzielić się jedną z nich: 'pierwszy rzecz, którą powinieneś zrobić ter czytanie czyjejś odpowiedzi na twoje pytanie jest głosowaniem nad odpowiedzią, tak jak robi to każdy inny użytkownik (z wystarczającą reputacją). Głosuj na pytania, które są pomocne ". Jest więcej ... Możesz sprawdzić, co zrobić, gdy ktoś odpowie na twoje pytanie - http://stackoverflow.com/help/someone-answers. Po prostu chciałem się podzielić, jeśli spodobał ci się pomysł: o) –

Odpowiedz

6

Jednym ze sposobów obejścia tego problemu jest ograniczenie liczby "zagnieżdżania" tylko jednego pola do korzystania z BigQuery User-Defined Functions. Są niezwykle potężne, ale wciąż mają świadomość, że są pewne. I najważniejsze z mojego przyszłego mieć na uwadze - są dość kandydatami do zakwalifikowane jako drogich High-Compute queries

złożonych zapytań można spożywać niezwykle dużych zasobów obliczeniowych względem liczby bajtów przetworzonych. Zwykle takie zapytania zawierają bardzo dużą liczbę klauzul JOIN lub CROSS JOIN lub złożonych Funkcje zdefiniowane przez użytkownika.

więc poniżej przykładem, że "naśladować" gniazdem (b, c) z przykładu w questino:

SELECT a, d.b, d.c FROM 
JS((  // input table 
    SELECT a, NEST(CONCAT(STRING(b), ',', STRING(c))) AS d 
    FROM (
    SELECT * FROM 
    (SELECT 1 AS a, 5 AS b, 2 AS c), 
    (SELECT 1 AS a, 3 AS b, 1 AS c), 
    (SELECT 2 AS a, 2 AS b, 1 AS c) 
) GROUP BY a), 
    a, d,  // input columns 
    "[{'name': 'a', 'type': 'INTEGER'}, // output schema 
    {'name': 'd', 'type': 'RECORD', 
    'mode': 'REPEATED', 
    'fields': [ 
     {'name': 'b', 'type': 'STRING'}, 
     {'name': 'c', 'type': 'STRING'} 
    ]  
    } 
    ]", 
    "function(row, emit){ // function 
    var c = []; 
    for (var i = 0; i < row.d.length; i++) { 
     x = row.d[i].toString().split(','); 
     t = {b:x[0], c:x[1]} 
     c.push(t); 
    }; 
    emit({a: row.a, d: c}); 
    }" 
) 

jest stosunkowo proste.Mam nadzieję, że będziesz w stanie przejść przez to i zorientować

Still - pamiętaj:

Bez względu na to, w jaki sposób rekord z zagnieżdżonych/powtarzanych pól tworzyć - BigQuery automatycznie spłaszcza wyniki kwerendy, więc widoczne rezultaty nie będzie zawierał powtórzonych pól . Powinieneś więc użyć go jako podseleksu, który generuje pośrednie wyniki dla natychmiastowego użycia przez to samo zapytanie.

Jako FYI, można udowodnić za siebie, że powyżej zwraca tylko dwa rekordy (nie trzy jak to wygląda, gdy jest spłaszczone) uruchamiając poniżej zapytania

SELECT COUNT(1) AS rows FROM (
    <above query here> 
) 

Another Ważna uwaga:
Jest to znane, że NEST() nie jest kompatybilny z UnFlatten Results Wyjściem i najczęściej jest używany do pośredniego wyniku w podzapytaniu.
Natomiast powyżej rozwiązania mogą być łatwo zapisane bezpośrednio do stołu (z niekontrolowanych spłaszczyć wyniki)

+0

Ważne na SO, możesz oznaczyć akceptowaną odpowiedź za pomocą kleszczyka po lewej stronie wysłanej odpowiedzi, pod głosowaniem. zobacz http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work#5235, dlaczego jest to ważne –

0

BigQuery automatycznie spłaszcza wyniki kwerendy, więc jeśli użyć funkcji NEST na zapytania najwyższym poziomie, wyniki nie będą zawierały pól powtarzane . Użyj funkcji NEST, gdy używana jest podsekcja, która daje pośrednie wyniki dla natychmiastowego użycia przez to samo zapytanie.

Zobacz więcej o gniazdem() w https://cloud.google.com/bigquery/query-reference#aggfunctions

Sprawdź również Big Query - Group By Clause not working with NEST() jak FYI

innego punktu mieć na uwadze - yo można zagnieżdżać tylko jedno pole - NEST(b) ale nie NEST(b, c)

Że powiedział - możesz uzyskać wynik podobny do tego, o który prosiłeś, ale musisz go zapisać do tabeli:

Od moje doświadczenie: użytkownicy bardziej stawiają czoła tym pytaniom podczas ładowania danych do BigQuery - to znaczy, że użytkownik może używać nlJSON z tak złożonym schematem, jak jest to potrzebne. W samym GBQ użytkownik zazwyczaj jest bardziej zainteresowany analizą, a takie pytania agregacyjne są rzadziej stosowane. Myślę, że obecny sysntax GBQ nie jest przyjazny/wystarczająco elastyczny, aby wygenerować dane "złożonego" hierarchicznego/zagnieżdżonego schematu i wstawić go do tabeli tylko w GBQ. Mimo to wydaje mi się, że możliwe są rozwiązania, ale zależy to od konkretnego przypadku użycia.

+0

Zagnieżdżanie wielu pól jest tym, o co naprawdę pytam. – Fardream

+1

Myślę, że niestety, 'NEST (b)' nie jest teraz obsługiwany. Byłoby wspaniale! Możesz przesłać swoje propozycje –

4

z wprowadzeniem BigQuery standardem SQL mamy łatwy sposób na radzenie sobie z zapisów
Spróbuj poniżej Nie zapomnij odznaczyć Use Legacy SQL pole pod Pokaż opcje

WITH YourTable AS (
    SELECT 1 AS a, 5 AS b, 2 AS c UNION ALL 
    SELECT 1 AS a, 3 AS b, 1 AS c UNION ALL 
    SELECT 2 AS a, 2 AS b, 1 AS c 
) 
SELECT a, ARRAY_AGG(STRUCT(b, c)) AS d 
FROM YourTable 
GROUP BY a