我有两列 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 字段是唯一的,并且您想要向段部分添加过滤器,或防止其他格式错误的 segment
值,例如 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 子句中。
但是与更简单的查询相比,此查询需要运行两个 Hive 作业,并且要求 id 字段是唯一的。
关于hive - 配置单元中集合中元素的平均数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36800480/