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)
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) –