2016-04-22 77 views
2

enter image description here配置單元中一組元素的平均數量?

我有兩列id和段。段是用逗號分隔的一組字符串。我需要在所有表格中找到平均數量的細分。一種方法是使用兩個單獨的查詢 -

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 

在上述情況下,答案將是8/4 = 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子句中。

但是,此查詢需要兩個Hive作業才能運行,而較簡單的查詢則需要該作業,並且要求id字段是唯一的。

+0

以上查詢的較長版本運行良好。謝謝 !! – BlitzKrieg

+0

是的,我刪除了錯誤的第一個查詢,所以你的意思是簡短的查詢,現在:) @BlitzKrieg更長的查詢會變得更慢,但它確實提供了更多的靈活性。 –