2016-04-22 3 views
2

enter image description hereハイブのセット内の要素の平均数?

私は2つの列idとsegmentを持っています。セグメントはコンマで区切られた文字列です。私はすべてのテーブルでセグメントの平均数を見つける必要があります。上記の場合であろう= 2 8/4を

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 

回答 - それを行う1つの方法は、2つの別個のクエリを使用することです。

これを達成するより良い方法はありますか?

答えて

2

試してみてください。

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

あなたのidフィールドは一意であり、あなたは、セグメント部にフィルタを追加、またはa,b,a,,bのような他の不正な形式のsegment値から守る、あなたが行うことができますしたい場合:

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 

次に、他のものをwhere句に追加できます。

しかし、このクエリでは、より単純なクエリの場合と比べて2つのHiveジョブを実行し、idフィールドを一意にする必要があります。

+0

上記のクエリのより長いバージョンが正常に機能しました。ありがとう!! – BlitzKrieg

+0

ええ、間違った最初のクエリを削除しました。つまり、実際に短いクエリを意味します:) @BlitzKrieg長いクエリは遅くなりますが、より柔軟性があります。 –

関連する問題