2016-01-11 11 views
5

Ist es möglich, eine wiederholte Datensatzspalte in BigQuery zu erstellen? Zum Beispiel für folgende Daten:BigQuery Creat wiederholt Datensatzfeld von Abfrage

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

Ist Folgendes möglich?

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

Um die folgenden Ergebnisse

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

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

Antwort

6

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)

+0

Wichtig auf SO, können Sie akzeptierte Antwort markieren, indem Sie das Häkchen auf der linken Seite der veröffentlichten Antwort, unterhalb der Abstimmung. Siehe http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work#5235, warum dies wichtig ist –

0

BigQuery automatisch verflacht Abfrage-Ergebnisse, zu erzeugen also, wenn Sie die NEST Funktion auf der obersten Ebene Abfrage verwenden, werden die Ergebnisse nicht Felder wiederholt enthalten . Verwenden Sie die NEST-Funktion, wenn Sie einen Subselect verwenden, der Zwischenergebnisse zur sofortigen Verwendung durch die gleiche Abfrage erzeugt.

Sehen Sie mehr über NEST() bei https://cloud.google.com/bigquery/query-reference#aggfunctions

Auch Big Query - Group By Clause not working with NEST() überprüfen, wie FYI

Ein weiterer Punkt im Auge haben - yo kann NEST nur ein Feld - NEST(b) aber nicht NEST(b, c)

That sagte - Sie können Ergebnis ähnlich zu dem, was Sie gefragt haben, aber Sie müssen es in die Tabelle schreiben

Von Meine Erfahrung: Benutzer sehen sich beim Laden von Daten in BigQuery mehr mit diesen Fragen konfrontiert - dh Benutzer können nlJSON mit einem so komplexen Schema wie benötigt verwenden. In GBQ selbst Benutzer in der Regel mehr in Analyse interessiert, Aggregation so über Typ Fragen sind seltener angestiegen. Ich denke, dass aktuelle GBQ-Sysntax nicht freundlich/flexibel genug ist, um Daten von "komplexen" hierarchischen/verschachtelten Schemata zu erzeugen und sie nur in GBQ in Tabellen einzufügen. Dennoch, ich denke, Problemumgehungen sind möglich, aber hängt von bestimmten Anwendungsfall

+0

Das Verschachteln mehrerer Felder ist das, was ich eigentlich frage. – Fardream

+1

Ich denke, leider, 'NEST (b)' wird jetzt nicht unterstützt. Wäre großartig! Sie können Ihre Vorschläge einreichen –

4

Mit der Einführung von BigQuery Standard-SQL haben wir einfache Möglichkeit bekommen mit Aufzeichnungen zu beschäftigen
unter Versuchen, nicht Vergessen Use Legacy SQL Checkbox unter Optionen anzeigen

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