Улей - сумма связанных значений

Я работаю над AWS Athena, чтобы фильтровать журналы балансировщика нагрузки. Я создал приведенную ниже таблицу и импортировал журналы в нее.

CREATE EXTERNAL TABLE IF NOT EXISTS elb_logs  (
  request_timestamp string,   
  elb_response_code string,    
  url string, 
   ) 

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
         'serialization.format' = '1','input.regex' = '([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:\-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \\\"([^ ]*) ([^ ]*) (- |[^ ]*)\\\" (\"[^\"]*\") ([A-Z0-9-]+) ([A-Za-z0-9.-]*)$' )
LOCATION 's3://athena-examples/elb/raw/';

Теперь я хочу получить количество ответов: 200 ОК, 400 и 500 ответов. Итак, я выполнил следующий запрос.

SELECT distinct(elb_response_code),
         count(url) AS count
FROM elb_logs
GROUP BY  elb_response_code

Это сработало, но возвращает все ответы, как показано ниже.

**response  count**
401   1270
201   1369
422   342
200   3568727
400   1221
404   444
304   10435
413   3
206   30
500   1542

Я хочу суммировать все 400 401 404 413 422 и то же самое для 2xx, 3xx и 5xx Таким образом, результат должен быть суммой 4xx (400 401 404 413 422)

**response  count**
4xx           52145  
2xx           1363224
5xx           532

person Bhuvanesh    schedule 26.03.2017    source источник


Ответы (1)


Предполагая, что все коды состоят из 3 символов

select      substr (elb_response_code,1,1) || 'xx' as elb_response_code_prefix
           ,count(*)                               as cnt

from        elb_logs

group by    1

И вот более общее решение

select      rpad (substr (elb_response_code,1,1),length(elb_response_code),'x') 
                      as elb_response_code_prefix
           ,count(*)  as cnt

from        elb_logs

group by    1
person David דודו Markovitz    schedule 26.03.2017
comment
Спасибо, он работает, возможно ли показать значение кода ответа с помощью xx. как 2xx, 3xx в окне результатов? Сейчас это 2,3,4,5. - person Bhuvanesh; 26.03.2017
comment
Пожалуйста. P.s. см. обновленное решение. Для этого есть много вариантов. - person David דודו Markovitz; 26.03.2017