hive性能问题

fengyangchao2 2014-04-23 05:12:12
最近通过hadoop+hbase+hive分析日志
有两张表:
f 表 和 r 表
表结构如下:
f 表(1000万条记录): r 表(300万条记录):
ip -> ip ip -〉ip
n -> 用户名
d -> 目标ip tag -> 上下线标示(1-下线;0-上线)
t -> 时间 t -> 时间(用户的上下线时间)

业务逻辑:根据目标IP和时间段查询用户名,

我的sql文如下:
select f.sip, f.sp, f.tip, f.tp, f.dip, f.dp, f.u, r1.n, f.d from (select r1.ip, r1.n from rd r1 join rd r2 on (r1.ip = r2.ip and r1.t <= '1398148807000' and r1.tag = '0' and r2.t >= '1398148623000' and r2.tag = '1') group by r1.ip, r1.n) r1 join ft f on (f.sip = r1.ip and f.d >= '1398148623000' and f.d <= '1398148807000')
(思路:先根据时间段查询 r 表,查出这段时间的在线IP和用户名,再查询 f 表,根据之前的用户名和ip列表查询过滤出访问了目标IP的用户列表)

结果能查询出来,但是要花费近半小时的时间,哪位大侠能否指导一下如何优化?



...全文
280 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengyangchao2 2014-05-12
  • 打赏
  • 举报
回复
@wfp458113181wfp 能否解释一下,这么修改原因或者目的?? 非常感谢!
wfp458113181wfp 2014-05-06
  • 打赏
  • 举报
回复
优化方案一:f和r表直接存储在hive 1、表结构优化 1.1、f和r按时间分区,按天即可 2、查询方案优化 1.1、 join ft f on (f.sip = r1.ip and f.d >= '1398148623000' and f.d <= '1398148807000') 修改为 join (select * ft where ft.d >= '1398148623000' and ft.d <= '1398148807000') f on (f.sip = r1.ip ) 1.2、 ( select r1.ip, r1.n from rd r1 join rd r2 on (r1.ip = r2.ip and r1.t <= '1398148807000' and r1.tag = '0' and r2.t >= '1398148623000' and r2.tag = '1') group by r1.ip, r1.n ) r1 修改为 ( select rt.ip,rt.n,last(rt.tag,rt.t) lasttag , last(rt.t) lasttime from rt where rt.t < '1398148807000' group by r1.ip,r1.n ) r1 1.3、整个sql可以表达为 select f.sip, f.sp, f.tip, f.tp, f.dip, f.dp, f.u, r1.n, f.d from ( select rt.ip,rt.n,last(rt.tag,rt.t) lasttag , last(rt.t) lasttime from rt where rt.t < '1398148807000' group by r1.ip,r1.n ) r1 join (select * ft where ft.d >= '1398148623000' and ft.d <= '1398148807000') f on (f.sip = r1.ip and (lasttag = '0' or (lasttag = '1' and lasttime > '1398148623000' ) )
vah101 2014-05-06
  • 打赏
  • 举报
回复
数据存在hbase上吗? hive去hbase上读数据么?
引用 楼主 fengyangchao2 的回复:
最近通过hadoop+hbase+hive分析日志 有两张表: ...
fengyangchao2 2014-05-05
  • 打赏
  • 举报
回复
业务逻辑是这样的, f 表中有用户的上网访问记录及时间, r 表中是用户的上线、下线时间以及用户名 我想根据 f 表中的源IP、目标IP及时间,查询 r 表中的对应的用户名,比如: f 表中的源IP为10.0.0.1 目标IP为218.108.248.200,时间为2014-05-04 09:00:00 在 r 中查询在2014-05-04 09:00:00在线的源IP为10.0.01的用户名。 我本来打算,在插入f 时,查询 r 表(在 f 中创建用户名字段),将对应的用户名插入到 f 中,这样就可以不用联表查询了。 但是,在查询 r 表时,时间很慢,一般要150毫秒左右,数据量大时,插入 f 表要十几个小时。 不知道哪位大侠能提供帮助???
FeelTouch Labs 2014-04-23
  • 打赏
  • 举报
回复
若表还可以重新设计,尽量对表进行分割(水平或垂直),保证单条记录数据量小。另外,适当建立索引。 你这个表是一定的,优化思路:1,尽量避免使用嵌套查询,必须时看观察子查询能否过滤掉一些行。2,尽量不要用“<=一”类的的字符,容易引起全盘扫描。

20,844

社区成员

发帖
与我相关
我的任务
社区描述
Hadoop生态大数据交流社区,致力于有Hadoop,hive,Spark,Hbase,Flink,ClickHouse,Kafka,数据仓库,大数据集群运维技术分享和交流等。致力于收集优质的博客
社区管理员
  • 分布式计算/Hadoop社区
  • 涤生大数据
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧