首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >优雅的HiveQL查询

优雅的HiveQL查询
EN

Stack Overflow用户
提问于 2013-12-02 05:56:48
回答 2查看 444关注 0票数 0

我有一个文件,其中的代码行如下:

代码语言:javascript
运行
复制
232404812.913232|1248|ip:tcp:jxta
232404812.913238|66|ip:udp:data
232404812.913615|98|ip:udp:l2tp:ppp:ip:tcp

我执行了以下HiveQL命令:

代码语言:javascript
运行
复制
CREATE EXTERNAL TABLE b_packet (timestamp string, packet_length int, protocol string) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY "|" 
LOCATION 's3://b-file/input/'; 

CREATE EXTERNAL TABLE b_packet_out (protocol string, cnt int) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t" 
LOCATION 's3://b-file/output/1/'; 

INSERT OVERWRITE TABLE b_packet_out SELECT 'overall', 
COUNT(*) FROM b_packet GROUP BY protocol; 

INSERT INTO TABLE b_packet_out SELECT 'tcp', 
COUNT(*) FROM b_packet WHERE protocol REGEXP '^ip:tcp'; 

INSERT INTO TABLE b_packet_out SELECT 'udp', 
COUNT(*) FROM b_packet WHERE protocol REGEXP '^ip:udp'; 

INSERT INTO TABLE b_packet_out SELECT 'icmp', 
COUNT(*) FROM b_packet WHERE protocol REGEXP '^ip:icmp'; 

这样我在输出表中就有了以下内容。

代码语言:javascript
运行
复制
hive> select * from b_packet_out;
OK
udp 2241
overall 10000
icmp    64
tcp 7633

有没有一种更优雅的HiveQL查询方法,这样我就可以减少行数来获得相同的输出?

EN

回答 2

Stack Overflow用户

发布于 2013-12-02 12:24:03

代码语言:javascript
运行
复制
select 
count(*) as overall,
sum( if(protocol like '^ip:tcp',1,0) as tcp,
sum( if(protocol like '^ip:udp',1.0) as udp,
sum( if(protocol like '^ip:icmp'1,0) as icmp 
from b_packet  

这会用一次数据生成相同的计数。

如果你有更多的协议,你也可以说select split(protocol,':') 1,count(*) group by split(protocol,':') 1,但这不会给出总的计数。

票数 0
EN

Stack Overflow用户

发布于 2018-03-07 01:16:19

这里有一个不同的解决方案,但它对数据进行多次传递,并且不会真正节省代码行数:

代码语言:javascript
运行
复制
SELECT          CASE WHEN GROUPING__ID = 0 THEN 'overall' ELSE 
                        CASE WHEN protocol LIKE 'ip:tcp%' THEN 'tcp'
                             WHEN protocol LIKE 'ip:udp%' THEN 'udp'
                             WHEN protocol LIKE 'ip:icmp%' THEN 'icmp'   END  END    AS protocol 
                , COUNT(1)                                                           AS cnt 
FROM            b_packet  
GROUP BY        CASE WHEN protocol LIKE 'ip:tcp%' THEN 'tcp'
                     WHEN protocole LIKE 'ip:udp%' THEN 'udp'
                     WHEN protocol LIKE 'ip:icmp%' THEN 'icmp'   END
GROUPING SETS   (
                    (CASE WHEN protocol LIKE 'ip:tcp%' THEN 'tcp'
                          WHEN protocol LIKE 'ip:udp%' THEN 'udp'
                          WHEN protocol LIKE 'ip:icmp%' THEN 'icmp'  END)
                    , () 
                ) 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20317756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档