実装数:私はJSON形式で、この次の辞書を持っているキー、値はBigQueryの
- を。どのように私はキーの総数、 "ID"辞書内の値を数えることができますか?
{ "FIL":{ "プロパティ":{ "ID":{ID_1: "A"、ID_2: "B"、ID_3: "C"、ID_4: "D"}}}}
- "a"という値は、そのような複数の辞書のid(id_1、...、id_5)のいずれかに現れることがあります。ある辞書のいずれかのIDに「a」が現れた回数を計算する必要があります。 1.については
実装数:私はJSON形式で、この次の辞書を持っているキー、値はBigQueryの
{ "FIL":{ "プロパティ":{ "ID":{ID_1: "A"、ID_2: "B"、ID_3: "C"、ID_4: "D"}}}}
、あなたがテーブルや繰り返しフィールドの外積を取るためにカンマ演算子を使用することができます(「表示オプション」の下の「使用レガシー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")
を使用することもできます。フィールドに文字列としてあなたのテーブルに格納されている、あなたの辞書を持っていると仮定すると
は、名前の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
GBQテーブルに辞書を保存する方法。スキーマと例を提供 –
重要なので、投票の下に投稿された回答の左側にあるチェックマークを使用して、受け入れられた回答に印を付けることができます。 http://meta.stackexchangeを参照してください。com/questions/5234/how-does-a-answer-work-work#5235が重要である理由について説明します。答えに投票することも重要です。役に立った答えを投票してください。もっとたくさんあります...誰かがあなたの質問に答えるときに何をすべきかを確認することができます - http://stackoverflow.com/help/someone-answers。 –