2017-03-26 6 views
1

Ich arbeite an AWS Athena, um Load Balancer-Protokolle zu filtern. Ich habe die folgende Tabelle erstellt und die Protokolle in die Tabelle importiert.Hive - Summe der zugehörigen Werte

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/'; 

Jetzt möchte ich die Zahl von 200 OK bekommen, 400 und 500 Antworten zählen. Also habe ich die folgende Abfrage ausgeführt.

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

Es funktionierte, aber es gibt alle Antworten zurück, wie unten.

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

Ich möchte für 2xx alle 400.401.404.413.422 und die gleiche Sache summieren, 3xx und 5xx So sollte das Ergebnis 4xx Summe (400.401.404.413.422)

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

Antwort

0

alle Codes Unter der Annahme, sein sind 3 Zeichen lang

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

from  elb_logs 

group by 1 

Und hier ist mehr generische Lösung

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 
+0

Danke, es funktioniert, Ist es möglich, den Wert des Antwortcodes mit xx anzuzeigen. wie 2xx, 3xx im Ergebnisfenster? Gerade jetzt zeigt es 2,3,4,5. – SQLadmin

+0

Siehe aktualisierte Antwort –

+0

Awesome :), danke Dudu – SQLadmin