Hive 配置单元中集合中元素的平均计数?

Hive 配置单元中集合中元素的平均计数?,hive,aggregate-functions,explode,hiveql,apache-hive,Hive,Aggregate Functions,Explode,Hiveql,Apache Hive,我有两列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 有没有更好的方法来实现

我有两列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

有没有更好的方法来实现这一点?

试试:

select sum(CASE segment 
           WHEN '' THEN 0 
           ELSE  size(split(segment,','))
           END
           )*1.0/count(*) from table_name;
如果您的id字段是唯一的,并且您希望向段部分添加一个筛选器,或防止其他格式错误的
值,如
a、b、
a、b
,您可以执行以下操作:

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子句中


但是此查询需要运行两个配置单元作业,而较简单的查询需要运行一个配置单元作业,并且要求id字段唯一。

上述查询的较长版本运行良好。谢谢是的,我删除了错误的第一个查询,所以你真的是指较短的查询,现在:)@BlitzKrieg较长的查询速度会较慢,但它确实提供了更多的灵活性。