我有两列id和segment。段是逗号分隔的字符串集。我需要在所有表中找到平均段数。一种方法是使用两个单独的查询 -
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.
有没有更好的方法来实现这一目标?
答案 0 :(得分: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字段是唯一的。