2016-08-09 10 views
3

より単純なデータの例を参照すると簡単な質問を得ることができました。助けが要る。1行= 1のイベント(ネストされたデータ内のネストされたデータ)のテーブルへのFireQuestへのFirebaseのエクスポートを

BigQuery内でjsonスタイルのデータを照会するのが初めてで、FirebaseがBigQueryにダンプする解析(イベント)データに問題があります。 1行のデータのフォーマットは以下の通りです(いくつかの綿毛を整えます)。

{ 
    "user_dim": { 
    "user_id": "some_identifier_here", 
    "user_properties": [ 
     { 
     "key": "special_key1", 
     "val": { 
      "val": { 
      "str_val": "894", 
      "int_val": null 
      } 
     } 
     }, 
     { 
     "key": "special_key2", 
     "val": { 
      "val": { 
      "str_val": "1", 
      "int_val": null 
      } 
     } 
     }, 
     { 
     "key": "special_key3", 
     "val": { 
      "val": { 
      "str_val": "23", 
      "int_val": null 
      } 
     } 
     } 
    ], 
    "device_info": { 
     "device_category": "mobile", 
     "mobile_brand_name": "Samsung", 
     "mobile_model_name": "model_phone" 
    }, 
    "dt_a": "1470625311138000", 
    "dt_b": "1470620345566000" 
    }, 
    "event_dim": [ 
    { 
     "name": "user_engagement", 
     "params": [ 
     { 
      "key": "firebase_event_origin", 
      "value": { 
      "string_value": "auto", 
      "int_value": null, 
      "float_value": null, 
      "double_value": null 
      } 
     }, 
     { 
      "key": "engagement_time_msec", 
      "value": { 
      "string_value": null, 
      "int_value": "30006", 
      "float_value": null, 
      "double_value": null 
      } 
     } 
     ], 
     "timestamp_micros": "1470675614434000", 
     "previous_timestamp_micros": "1470675551092000" 
    }, 
    { 
     "name": "new_game", 
     "params": [ 
     { 
      "key": "total_time", 
      "value": { 
      "string_value": "496048", 
      "int_value": null, 
      "float_value": null, 
      "double_value": null 
      } 
     }, 
     { 
      "key": "armor", 
      "value": { 
      "string_value": "2", 
      "int_value": null, 
      "float_value": null, 
      "double_value": null 
      } 
     }, 
     { 
      "key": "reason", 
      "value": { 
      "string_value": "power_up", 
      "int_value": null, 
      "float_value": null, 
      "double_value": null 
      } 
     } 
     ], 
     "timestamp_micros": "1470675825988001", 
     "previous_timestamp_micros": "1470675282500001" 
    }, 
    { 
     "name": "user_engagement", 
     "params": [ 
     { 
      "key": "firebase_event_origin", 
      "value": { 
      "string_value": "auto", 
      "int_value": null, 
      "float_value": null, 
      "double_value": null 
      } 
     }, 
     { 
      "key": "engagement_time_msec", 
      "value": { 
      "string_value": null, 
      "int_value": "318030", 
      "float_value": null, 
      "double_value": null 
      } 
     } 
     ], 
     "timestamp_micros": "1470675972778002", 
     "previous_timestamp_micros": "1470675614434002" 
    }, 
    { 
     "name": "won_game", 
     "params": [ 
     { 
      "key": "total_time", 
      "value": { 
      "string_value": "497857", 
      "int_value": null, 
      "float_value": null, 
      "double_value": null 
      } 
     }, 
     { 
      "key": "level", 
      "value": { 
      "string_value": null, 
      "int_value": "207", 
      "float_value": null, 
      "double_value": null 
      } 
     }, 
     { 
      "key": "sword", 
      "value": { 
      "string_value": "iron", 
      "int_value": null, 
      "float_value": null, 
      "double_value": null 
      } 
     } 
     ], 
     "timestamp_micros": "1470677171374007", 
     "previous_timestamp_micros": "1470671343784007" 
    } 
    ] 
} 

私はオブジェクトuser_dimの最初の部分でうまく動作することができました、私の元の質問への回答に基づいています。しかし、私がevent_dimフィールドへの同様のアプローチを試みると(それをネストしない)、クエリは "エラー:複数の要素を生成したスカラーサブクエリ"というエラーメッセージで失敗します。私は疑問があります。これは、event_dimが配列そのものであり、それらにも配列を持つ構造体を含んでいるという事実によるものです。

ここで私がエラーを出している基本的な質問ですが、BQのこのタイプのデータを扱う私の要素からかなり外れており、完全にコースから外れる可能性があります。

SELECT 
    (SELECT name FROM UNNEST(event_dim) WHERE name = 'user_engagement') AS event_name 
FROM 
    my_table; 

私はためつもりだ最終的な結果は、各オブジェクトevent_dim配列内のイベントにつき1行を出力し、テーブルにオブジェクトのこれらのタイプの多くを含むテーブルを回すことができるクエリです。すなわち上記の例のオブジェクトの場合、最初の列のセットが同一であり、ちょうどuser_dimのメタデータである4行を出力したいと考えています。次に、event_name, firebase_event_origin, engagement_time_msec, total_time, armor, reason, level, swordのような可能なイベントごとに存在することがわかっているものに基づいて明示的に定義できる列を作成し、そのイベントパラメータの値を入力します。

+0

「エラー:スカラーサブクエリが複数の要素を生成しました」というクエリを共有できますか? –

+0

@FelipeHoffaが編集しました – KevinTydlacka

答えて

3

希望は、以下のあなたの次のプッシュ

WITH YourTable AS (
    SELECT ARRAY[ 
    STRUCT(
     "user_engagement" AS name, 
     ARRAY<STRUCT<key STRING, val STRUCT<str_val STRING, int_val INT64>>>[ 
     STRUCT("firebase_event_origin", STRUCT("auto", NULL)), 
     STRUCT("engagement_time_msec", STRUCT("30006", NULL))] AS params, 
     1470675614434000 AS TIMESTAMP_MICROS, 
     1470675551092000 AS previous_timestamp_micros 
    ), 
    STRUCT(
     "new_game" AS name, 
     ARRAY<STRUCT<key STRING, val STRUCT<str_val STRING, int_val INT64>>>[ 
     STRUCT("total_time", STRUCT("496048", NULL)), 
     STRUCT("armor", STRUCT("2", NULL)), 
     STRUCT("reason", STRUCT("power_up", NULL))] AS params, 
     1470675825988001 AS TIMESTAMP_MICROS, 
     1470675282500001 AS previous_timestamp_micros 
    ), 
    STRUCT(
     "user_engagement" AS name, 
     ARRAY<STRUCT<key STRING, val STRUCT<str_val STRING, int_val INT64>>>[ 
     STRUCT("firebase_event_origin", STRUCT("auto", NULL)), 
     STRUCT("engagement_time_msec", STRUCT("318030", NULL))] AS params, 
     1470675972778002 AS TIMESTAMP_MICROS, 
     1470675614434002 AS previous_timestamp_micros 
    ), 
    STRUCT(
     "won_game" AS name, 
     ARRAY<STRUCT<key STRING, val STRUCT<str_val STRING, int_val INT64>>>[ 
     STRUCT("total_time", STRUCT("497857", NULL)), 
     STRUCT("level", STRUCT("207", NULL)), 
     STRUCT("sword", STRUCT("iron", NULL))] AS params, 
     1470677171374007 AS TIMESTAMP_MICROS, 
     1470671343784007 AS previous_timestamp_micros 
    ) 
    ] AS event_dim 
) 
SELECT 
    name, 
    (SELECT val.str_val FROM UNNEST(dim.params) WHERE key = "firebase_event_origin") AS firebase_event_origin, 
    (SELECT val.str_val FROM UNNEST(dim.params) WHERE key = "engagement_time_msec") AS engagement_time_msec, 
    (SELECT val.str_val FROM UNNEST(dim.params) WHERE key = "total_time") AS total_time, 
    (SELECT val.str_val FROM UNNEST(dim.params) WHERE key = "armor") AS armor, 
    (SELECT val.str_val FROM UNNEST(dim.params) WHERE key = "reason") AS reason, 
    (SELECT val.str_val FROM UNNEST(dim.params) WHERE key = "level") AS level, 
    (SELECT val.str_val FROM UNNEST(dim.params) WHERE key = "sword") AS sword 
FROM YourTable, UNNEST(event_dim) AS dim 
ミハイルの答えに基づいて
6

を与えることができますが、実際のFirebaseデータセット以上:

SELECT 
    user_dim.app_info.app_instance_id, 
    timestamp_micros, 
    (SELECT value.int_value FROM UNNEST(dim.params) WHERE key = "level") AS level, 
    (SELECT value.int_value FROM UNNEST(dim.params) WHERE key = "coins") AS coins, 
    (SELECT value.int_value FROM UNNEST(dim.params) WHERE key = "powerups") AS powerups 
FROM `dataset.table`, UNNEST(event_dim) AS dim 
WHERE timestamp_micros=1464718937589000 

(今後の参考のためにここでそれを保存し、簡単に著作貼り付け可能性)

関連する問題