2016-06-21 5 views
0

Осуществление следующих проблем в BigQuery:Key, Value Count в BigQuery

  1. У меня есть Нижеследующая словарь в формате JSON. Как я могу подсчитать общее количество ключей, значение внутри словаря «id»?

{ "фил": { "свойство": { "идентификатор": {ID_1: "а", ID_2: "б", id_3: "С", id_4: "г"}}}}

  1. Значение «a» может отображаться в любом из идентификаторов (id_1, ..., id_5) в нескольких таких словарях. Необходимо вычислить количество раз, когда «а» появилось в любом из идентификаторов в любом из словарей.
+0

как вы храните ваши словари в гБк таблице. укажите схему и пример –

+0

Важно, что вы можете отметить принятый ответ, используя отметку слева от опубликованного ответа под голосом. см. http: //meta.stackexchange.com/questions/5234/how-do-accepting-a-answer-work # 5235, почему это важно. Также важно проголосовать за ответ. Голосовые ответы полезны. Есть еще ... Вы можете проверить, что делать, когда кто-то отвечает на ваш вопрос - http://stackoverflow.com/help/someone-answers. –

ответ

0

Для 1., с помощью standard SQL (снимите флажок «Использовать прежние SQL» в разделе «Show Options») можно использовать оператор запятой взять декартово произведение таблицы и повторное поле:

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: Как я могу подсчитать общее число бер ключа, значение внутри "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: Необходимо рассчитать количество раз "а" (любое значение) появился в любом из идентификаторов в любом из словарей.

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  
Смежные вопросы