2016-04-22 6 views
2

enter image description hereDurchschnittliche Anzahl der Elemente in einem Set in Bienenstock?

Ich habe zwei Spalten ID und Segment. Segment ist ein durch Kommata getrennter String-Satz. Ich muss die durchschnittliche Anzahl der Segmente in der gesamten Tabelle finden. Eine Möglichkeit, es zu tun ist durch zwei separate Abfragen mit -

A - select count(*) from table_name; 
B - select count(*) from table_name LATERAL VIEW explode(split(segment, ',') lTable AS singleSegment where segment != "" 
avg = B/A 

Antwort 8/4 = 2 im obigen Fall wäre.

Gibt es einen besseren Weg, dies zu erreichen?

Antwort

2

Versuchen:

select sum(CASE segment 
      WHEN '' THEN 0 
      ELSE size(split(segment,',')) 
      END 
      )*1.0/count(*) from table_name; 

Wenn Ihr ID-Feld eindeutig zuzuordnen sind, und Sie möchten einen Filter auf das Segment Teil hinzuzufügen, oder zum Schutz gegen andere fehlerhafte segment Werte wie a,b, und a,,b, könnten Sie tun:

SELECT SUM(seg_size)*1.0/count(*) FROM (
    SELECT count(*) as seg_size from table_name 
    LATERAL VIEW explode(split(segment, ',')) lTable AS singleSegment 
    WHERE trim(singleSegment) != "" 
    GROUP BY id 
) sizes 

Dann können Sie andere Sachen in die Where-Klausel hinzufügen.

Diese Abfrage erfordert jedoch die Ausführung von zwei Hive-Jobs im Vergleich zu einer für die einfachere Abfrage und erfordert, dass das ID-Feld eindeutig ist.

+0

Die längere Version der obigen Abfrage funktionierte gut. Vielen Dank !! – BlitzKrieg

+0

Ja, ich habe die falsche erste Abfrage gelöscht, also meinst du jetzt die kürzere Abfrage :) @BlitzKrieg Die längere Abfrage wird langsamer, bietet aber etwas mehr Flexibilität. –

Verwandte Themen