2016-04-22 81 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更长的查询会变得更慢,但它确实提供了更多的灵活性。 –