2

在此处输入图像描述

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

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

4

1 回答 1

2

尝试:

select sum(CASE segment 
           WHEN '' THEN 0 
           ELSE  size(split(segment,','))
           END
           )*1.0/count(*) from table_name;

如果您的 id 字段是唯一的,并且您想向分段部分添加过滤器,或者防止其他格式错误的segment值(例如a,b,and 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 字段是唯一的。

于 2016-04-22T18:05:50.783 回答