Einer der Weg um NEST()
gehen Beschränkung der "Verschachtelung" nur ein Feld ist zu verwenden BigQuery User-Defined Functions. Sie sind extrem leistungsfähig, haben aber immer noch einige Limits und Limitations zu beachten. Und das wichtigste aus meiner prospektiven im Auge zu haben - sie sind durchaus Kandidaten für so teuer High-Compute queries
Komplexe Abfragen qualifiziert werden können bezogen auf die Anzahl der verarbeiteten Byte außerordentlich große Rechenressourcen verbrauchen. In der Regel enthalten solche Abfragen eine sehr große Anzahl von JOIN- oder CROSS JOIN-Klauseln oder komplexen benutzerdefinierten Funktionen.
So, ist unten Beispiel, dass "nachahmen" NEST (b, c) aus Beispiel in 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});
}"
)
Es ist relativ einfach.Ich hoffe, dass Sie durch sie zu Fuß in der Lage und
Noch eine Idee - denken Sie daran:
Egal, wie Sie Datensatz erstellen mit verschachtelten/häufigeren Felder - BigQuery flacht automatisch Abfrage-Ergebnisse, so sichtbare Ergebnisse enthält keine wiederholten Felder. Sie sollten es also als Subselect verwenden, der Zwischenergebnisse zur sofortigen Verwendung durch die gleiche Abfrage erzeugt.
Als FYI, können Sie für sich selbst beweisen, dass oben nur zwei Datensätze zurückgibt (nicht drei, wie es aussieht, wenn es abgeflacht ist) von unten Abfrage ausgeführt
SELECT COUNT(1) AS rows FROM (
<above query here>
)
Noch ein wichtiger Hinweis:
Dies ist eine bekannte NEST()
ist nicht kompatibel mit UnFlatten Results
Ausgabe und wird meist für Zwischenergebnis in Unterabfrage verwendet.
Im Gegensatz dazu kann obige Lösung einfach direkt auf Tabelle gespeichert werden (mit ungeprüften Ergebnissen Flatten)
Wie Sie zu deaktivieren - ich bin relativ neue Benutzer sO (nur wenige Monate hier) so noch einige Regeln um es zu lernen - wollte einen von ihnen teilen: 'Die ersten was du tun solltest af Wenn jemand die Antwort auf Ihre Frage liest, ist die Abstimmung über die Antwort wie bei jedem anderen Benutzer (mit ausreichendem Ruf). Stimmen Sie Antworten ab, die hilfreich sind. Es gibt mehr ... Sie können überprüfen, was zu tun ist, wenn jemand Ihre Frage beantwortet - http://stackoverflow.com/help/someone-answers. Ich wollte nur teilen, falls Sie eine Idee mögen: o) –