2017-07-18 2 views
0

Schema in BigQuery Feld: Artikel Typ: stringWie Abfragen von Arrays in BigQuery?

Wert in der Tabelle in Artikel Feld als String {"data": [{"id": "1234", "plan": {"sub_id": "567", "metadata": {"currentlySelling": "true", "custom_attributes": "{\"shipping\": true,\"productLimit\":10}", "Features": "[\"10 products\", \"Online support\"]"}, "name": "Personal", "object": "plan"}, "quantity": 1}], "has_more": false}

Zwei Fragen 1) gespeichert ist, wie ich innerhalb des Arrays zB abfragen können: Wo Versand wahr ist oder Eines der Features ist "Online-Unterstützung" 2) Der Grund, warum ich die Daten als String speichern musste, weil sich der Wert "custom_attributes" ändern kann. Gibt es eine bessere Möglichkeit, Daten in BigQuery zu speichern, wenn sich der Wert eines der verschachtelten Schlüssel ändern kann?

+0

sollten Sie das tatsächliche Schema Ihrer Tabelle klären! auch - was hast du bisher probiert? Bitte bearbeiten Sie Ihre Frage, um ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) des Codes anzuzeigen, mit dem Sie Probleme haben, und dann können wir versuchen, mit dem spezifischen Problem zu helfen. Sie können auch [Wie Sie fragen] (http://stackoverflow.com/help/how-to-ask) lesen. –

Antwort

2

Ihre Anfrage würde wie folgt sein:

#standardSQL 
SELECT game 
FROM YourTable 
WHERE EXISTS (SELECT 1 FROM UNNEST(participant) WHERE name = 'sam'); 

Dies gibt alle Spiele, wo 'sam' ein Teilnehmer war. Hier ist ein in sich geschlossenes Beispiel:

#standardSQL 
WITH YourTable AS (
    SELECT 'A' AS game, ARRAY<STRUCT<name STRING, age INT64>>[('sam', 12), ('tony', 12), ('julia', 12)] AS participant UNION ALL 
    SELECT 'B', ARRAY<STRUCT<name STRING, age INT64>>[('sam', 12), ('max', 12), ('jacob', 12)] UNION ALL 
    SELECT 'C', ARRAY<STRUCT<name STRING, age INT64>>[('sam', 12), ('max', 12), ('julia', 12)] 
) 
SELECT game 
FROM YourTable 
WHERE EXISTS (SELECT 1 FROM UNNEST(participant) WHERE name = 'sam'); 

Wenn Sie die Daten schwenken wollte eine Spalte für jeden Teilnehmer haben, können Sie eine Abfrage wie folgt verwenden:

#standardSQL 
CREATE TEMP FUNCTION WasParticipant(
    p_name STRING, participant ARRAY<STRUCT<name STRING, age INT64>>) AS (
    EXISTS(SELECT 1 FROM UNNEST(participant) WHERE name = p_name) 
); 

WITH YourTable AS (
    SELECT 'A' AS game, ARRAY<STRUCT<name STRING, age INT64>>[('sam', 12), ('tony', 12), ('julia', 12)] AS participant UNION ALL 
    SELECT 'B', ARRAY<STRUCT<name STRING, age INT64>>[('sam', 12), ('max', 12), ('jacob', 12)] UNION ALL 
    SELECT 'C', ARRAY<STRUCT<name STRING, age INT64>>[('sam', 12), ('max', 12), ('julia', 12)] 
) 
SELECT 
    ARRAY_AGG(IF(WasParticipant('sam', participant), game, NULL) IGNORE NULLS) AS sams_games, 
    ARRAY_AGG(IF(WasParticipant('tony', participant), game, NULL) IGNORE NULLS) AS tonys_games, 
    ARRAY_AGG(IF(WasParticipant('julia', participant), game, NULL) IGNORE NULLS) AS julias_games, 
    ARRAY_AGG(IF(WasParticipant('max', participant), game, NULL) IGNORE NULLS) AS maxs_games 
FROM YourTable; 

Dieses ein Array zurückgibt mit Spiele für jeden Teilnehmer gespielt.

+0

Die Daten werden als String gespeichert. Das obige würde funktionieren, wenn die Daten als wiederholt gespeichert werden. 'Fehler: In UNNEST referenzierte Werte müssen Arrays sein. UNNEST enthält Ausdruck vom Typ STRING um [2:36] ' –

+0

Also' Teilnehmer' ist eine Zeichenkette, die aussieht wie ''[{" name ":" sam "," age ": 12}, {" name ":" tony "," Alter ": 12}, {" Name ":" Julia "," Alter ": 12}]' '? Es wäre besser, wenn Ihr Tabellenschema mit den Daten übereinstimmt und ein Feld REPEATED RECORD für 'Teilnehmer' verwendet wird. –

+0

Ich würde wirklich empfehlen, auf meinen Kommentar zur Frage selbst zu achten !! - Das würde Zeit für uns alle sparen: o) –

Verwandte Themen