2016-11-17 4 views
0

Это моя вложенная JSON:найти все записи, которые имеют «истинное» значение в гнездовом JSON

{ 
    "business_id":"pNQwnY_q4okdlnPiR-3RBA", 
    "full_address":"6105 S Fort Apache Rd\nSpring Valley\nLas Vegas, NV 89148", 
    "hours":{ }, 
    "open":true, 
    "categories":[ ], 
    "city":"Las Vegas", 
    "review_count":68, 
    "name":"Empire Bagels", 
    "neighborhoods":[ 
     "Spring Valley" 
    ], 
    "longitude":-115.298175926911, 
    "state":"NV", 
    "stars":3.0, 
    "latitude":36.07728616051, 
    "attributes":{ 
     "Take-out":true, 
     "Wi-Fi":"no", 
     "Good For":{ 
     "dessert":false, 
     "latenight":false, 
     "lunch":false, 
     "dinner":false, 
     "breakfast":true, 
     "brunch":false 
     }, 
     "Caters":true, 
     "Noise Level":"quiet", 
     "Takes Reservations":false, 
     "Delivery":false, 
     "Ambience":{ 
     "romantic":false, 
     "intimate":false, 
     "classy":false, 
     "hipster":false, 
     "divey":false, 
     "touristy":false, 
     "trendy":false, 
     "upscale":false, 
     "casual":true 
     }, 
     "Parking":{ 
     "garage":false, 
     "street":false, 
     "validated":false, 
     "lot":true, 
     "valet":false 
     }, 
     "Has TV":true, 
     "Outdoor Seating":true, 
     "Attire":"casual", 
     "Alcohol":"none", 
     "Waiter Service":false, 
     "Accepts Credit Cards":true, 
     "Good for Kids":true, 
     "Good For Groups":true, 
     "Price Range":1 
    }, 
    "type":"business" 
} 

Я запрашивая это с помощью апачской дрели. Я хочу узнать топ-10 наиболее распространенного «истинного» атрибутов для всех ресторанов в city.I хочет что-то вроде:

Accepts Credit Cards : 200, 
Alcohol: 300, 
Good For Kids : 500 

Как будет мой запрос выглядит? Это то, что я сделал:

select attributes, count(*) attributes from `yelp_dataset` group by attributes; 

Я получаю эту ошибку:

Error: SYSTEM ERROR: UnsupportedOperationException: Map, Array, Union or repeated scalar type should not be used in group by, order by or in a comparison operator. Drill does not support compare between MAP:REQUIRED and MAP:REQUIRED. 

Fragment 0:0 

[Error Id: 8fe8a616-92c7-4da0-ab65-b5542d391f47 on 192.168.10.104:31010] (state=,code=0) 

Что должно быть мой запрос?

ответ

0

я не смог автоматически выравниваться атрибуты, используя KVGEN() из-за смешанных типов данных, но вы можете попробовать КТР с немного UNION ALL грубой силы:

WITH ReviewAttributes AS (
    SELECT 
     reviews.name, 
     'Accepts Credit Cards' as `AttributeName`, 
     CASE WHEN reviews.attributes.`Accepts Credit Cards` = true THEN 1 ELSE 0 END as `AttributeValue` 
    FROM 
     `yelp_dataset` reviews 
    UNION ALL 
    SELECT 
     reviews.name, 
     'Alcohol' as `AttributeName`, 
     CASE WHEN reviews.attributes.`Alcohol` <> 'none' THEN 1 ELSE 0 END as `AttributeValue` 
    FROM 
     `yelp_dataset` reviews 
    UNION ALL 
    SELECT 
     reviews.name, 
     'Good for Kids' as `AttributeName`, 
     CASE WHEN reviews.attributes.`Good for Kids` = true THEN 1 ELSE 0 END as `AttributeValue` 
    FROM 
     `yelp_dataset` reviews 
) 
SELECT 
    `AttributeName`, 
    SUM(`AttributeValue`) as `AttributeCount` 
FROM 
    ReviewAttributes 
GROUP BY 
    `AttributeName`; 

В заявлениях СЛУЧАЙ может также поможет вам обойти некоторые различия между булевыми и перечислимыми полями, например, подсчет Alcohol из вашего образца.