2016-06-21 13 views
0
にBigQueryの中に以下のような問題点の

実装数:私はJSON形式で、この次の辞書を持っているキー、値はBigQueryの

  1. を。どのように私はキーの総数、 "ID"辞書内の値を数えることができますか?

{ "FIL":{ "プロパティ":{ "ID":{ID_1: "A"、ID_2: "B"、ID_3: "C"、ID_4: "D"}}}}

  1. "a"という値は、そのような複数の辞書のid(id_1、...、id_5)のいずれかに現れることがあります。ある辞書のいずれかのIDに「a」が現れた回数を計算する必要があります。 1.については
+0

GBQテーブルに辞書を保存する方法。スキーマと例を提供 –

+0

重要なので、投票の下に投稿された回答の左側にあるチェックマークを使用して、受け入れられた回答に印を付けることができます。 http://meta.stackexchangeを参照してください。com/questions/5234/how-does-a-answer-work-work#5235が重要である理由について説明します。答えに投票することも重要です。役に立った答えを投票してください。もっとたくさんあります...誰かがあなたの質問に答えるときに何をすべきかを確認することができます - http://stackoverflow.com/help/someone-answers。 –

答えて

0

、あなたがテーブルや繰り返しフィールドの外積を取るためにカンマ演算子を使用することができます(「表示オプション」の下の「使用レガシーSQL」ボックスのチェックを外す)standard SQLを使用して:

WITH MyTable AS (
    SELECT STRUCT(STRUCT(ARRAY<STRUCT<key STRING, value STRING>>[('id_1', 'a'), ('id_2', 'b'), ('id_3', 'c'), ('id_4', 'd')] AS id) AS property) AS fil 
    UNION ALL SELECT STRUCT(STRUCT(ARRAY<STRUCT<key STRING, value STRING>>[('id_1', 'b'), ('id_3', 'e')] AS id) AS property) AS fil 
    UNION ALL SELECT STRUCT(STRUCT(ARRAY<STRUCT<key STRING, value STRING>>[] AS id) AS property) AS fil 
    UNION ALL SELECT STRUCT(STRUCT(ARRAY<STRUCT<key STRING, value STRING>>[('id_4', 'a'), ('id_2', 'c')] AS id) AS property) AS fil) 
SELECT 
    COUNT(DISTINCT id.key) AS num_keys, 
    COUNT(DISTINCT id.value) AS num_values 
FROM MyTable t, t.fil.property.id AS id; 
+----------+------------+ 
| num_keys | num_values | 
+----------+------------+ 
|  4 |   5 | 
+----------+------------+ 

レガシーSQLを使用すると、EXACT_COUNT_DISTINCT(これはおそらく平坦化する必要はありません)を使用して同様のことを達成できますが、インラインの例を設定するのは難しくなります。

2.の場合、フラット化の標準SQLを使用して同様の方法を適用し、"a"の出現回数をCOUNTIF(id.value = "a")とカウントすることができます。従来のSQLでは、COUNT(t.fil.property.id.value = "a")を使用することもできます。フィールドに文字列としてあなたのテーブルに格納されている、あなたの辞書を持っていると仮定すると

0

は、名前のJSON

答えのためのキーは、クエリを下回っています。上記のクエリの

それはJSONフィールドを解析し、その親(辞書名)と一緒にすべてのキー/値のペアを抽出

SELECT parent, key, value 
FROM JS((
    SELECT json FROM 
    (SELECT '{"fil":{"property":{"id":{"id_1":"a","id_2":"b","id_3":"c","id_4":"d"}}}}' AS json), 
    (SELECT '{"fil":{"property":{"type":{"id_1":"x","id_2":"a","id_3":"y","id_4":"z"}, "category":{"id_1":"v","id_2":"w","id_3":"a","id_4":"b"}}}}' AS json) 
), 
    json,         // Input columns 
    "[{name: 'parent', type:'string'},  // Output schema 
    {name: 'key', type:'string'}, 
    {name: 'value', type:'string'}]", 
    "function(r, emit) {     // The function 
     x = JSON.parse(r.json); 
     processKey(x, ''); 
     function processKey(node, parent) { 
     Object.keys(node).map(function(key) { 
      value = node[key].toString(); 
      if (value !== '[object Object]') { 
      emit({parent:parent, key:key, value:value}); 
      } else { 
      if (parent !== '' && parent.substr(parent.length-1) !== '.') {parent += '.'}; 
      processKey(node[key], parent + key); 
      }; 
     });   
     }; 
    }" 
) 

結果は、そこから

parent     key  value  
fil.property.id   id_1 a  
fil.property.id   id_2 b  
fil.property.id   id_3 c  
fil.property.id   id_4 d  
fil.property.type  id_1 x  
fil.property.type  id_2 a  
fil.property.type  id_3 y  
fil.property.type  id_4 z  
fil.property.category id_1 v  
fil.property.category id_2 w  
fil.property.category id_3 a  
fil.property.category id_4 b 

以下の通りです両方の回答を簡単に得ることができます:

Q1:キーのBER、 "ID" 内の値()辞書

SELECT parent, COUNT(1) AS key_value_pairs 
FROM JS((
    SELECT json FROM 
    (SELECT '{"fil":{"property":{"id":{"id_1":"a","id_2":"b","id_3":"c","id_4":"d"}}}}' AS json), 
    (SELECT '{"fil":{"property":{"type":{"id_1":"x","id_2":"a","id_3":"y","id_4":"z"}, "category":{"id_1":"v","id_2":"w","id_3":"a","id_4":"b"}}}}' AS json) 
), 
    json,         // Input columns 
    "[{name: 'parent', type:'string'},  // Output schema 
    {name: 'key', type:'string'}, 
    {name: 'value', type:'string'}]", 
    "function(r, emit) {     // The function 
     x = JSON.parse(r.json); 
     processKey(x, ''); 
     function processKey(node, parent) { 
     Object.keys(node).map(function(key) { 
      value = node[key].toString(); 
      if (value !== '[object Object]') { 
      emit({parent:parent, key:key, value:value}); 
      } else { 
      if (parent !== '' && parent.substr(parent.length-1) !== '.') {parent += '.'}; 
      processKey(node[key], parent + key); 
      }; 
     });   
     }; 
    }" 
) 
GROUP BY parent 

結果は

parent     key_value_pairs 
fil.property.id   4  
fil.property.type  4  
fil.property.category 4  

Q2である。回数を計算する必要が "A"(任意の値)は、辞書のいずれかのIDに表示されています。

SELECT value, COUNT(1) AS value_appearances 
FROM JS((
    SELECT json FROM 
    (SELECT '{"fil":{"property":{"id":{"id_1":"a","id_2":"b","id_3":"c","id_4":"d"}}}}' AS json), 
    (SELECT '{"fil":{"property":{"type":{"id_1":"x","id_2":"a","id_3":"y","id_4":"z"}, "category":{"id_1":"v","id_2":"w","id_3":"a","id_4":"b"}}}}' AS json) 
), 
    json,         // Input columns 
    "[{name: 'parent', type:'string'},  // Output schema 
    {name: 'key', type:'string'}, 
    {name: 'value', type:'string'}]", 
    "function(r, emit) {     // The function 
     x = JSON.parse(r.json); 
     processKey(x, ''); 
     function processKey(node, parent) { 
     Object.keys(node).map(function(key) { 
      value = node[key].toString(); 
      if (value !== '[object Object]') { 
      emit({parent:parent, key:key, value:value}); 
      } else { 
      if (parent !== '' && parent.substr(parent.length-1) !== '.') {parent += '.'}; 
      processKey(node[key], parent + key); 
      }; 
     });   
     }; 
    }" 
) 
GROUP BY value 

value value_appearances  
a  3  
b  2  
c  1  
d  1  
x  1  
y  1  
z  1  
v  1  
w  1