Hive企业使用优化二

大表【拆分】

子表
根据实际业务可以把大表拆分为几个小表。
例如可以把merit_log20180304表拆分出ip,user,url,date 等字表。

外部表、分区表

  • 结合使用 :把分区和外部表结合使用
create external table if not exists  emp_partition(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
)
partitioned by (month string)
row format delimited fields terminated by '\t'
  • 多级分区
drop table default.kwu_tracklog;  
create EXTERNAL table default.kwu_tracklog (   
    datetime string comment "时间 : 如2015-01-01 11:30:01:123",  
    ip string comment "IP:用户本机IP或用户所在网段对外路由IP",  
    cookieid string comment "用户cookie:和讯统一在用户端生成的唯一标志",  
    userid string comment "用户和讯注册ID :用户在和讯网的注册ID",   
    logserverip string comment "记录日志服务器IP : 和讯的日志收集服务器IP",  
    referer string comment "来源 :用户浏览网页的REFER",  
    requesturl string comment "访问网址 : 当前访问网址" ,  
    remark1 string comment "【暂时没用】 :该数据无意义,由于早期加入目前不能去除",  
    remark2 string comment "【暂时没用】 : 该数据无意义,由于早期加入目前不能去除",  
    alexaflag string comment "ALEXA标志  :这个字段也是早期加入,当用户安装alexa工具时值为1,否则为0.早期加入,目前来看应该没有任何意义了。",  
    ua string comment "UA :用户浏览器UA",  
    wirelessflag string comment "无线频道标志:给无线频道专用的,一个单词,表示该文章对应和讯哪一个频道"  
)   
comment "浏览轨迹日志"  
partitioned by(day string comment "按天的分区表字段",hour string comment "按小时的分区表字段")
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '  
location '/hdfs/hive/default/kwu_tracklog';  
  • 导入数据
load data local inpath '/diskg/hexunlogs/tracklog_by5min/tracklog_10.0.121.74/20151014/2015101414*.dat' overwrite into table default.kwu_tracklog partition (day='20151014',hour='14');  
load data local inpath '/diskg/hexunlogs/tracklog_by5min/tracklog_10.0.121.74/20151014/2015101415*.dat' overwrite into table default.kwu_tracklog partition (day='20151014',hour='15'); 
  • 测试导入数据
select count(*) from default.kwu_tracklog where day='20151014' and hour='14' limit 1;  
select count(*) from default.kwu_tracklog where day='20151014' and hour='15' limit 1; 

数据

  • 存储格式(textfile、orcfile、parquet)
drop table default.kwu_tracklog;  
create EXTERNAL table default.kwu_tracklog (   
    datetime string comment "时间 : 如2015-01-01 11:30:01:123",  
    ip string comment "IP:用户本机IP或用户所在网段对外路由IP",  
    cookieid string comment "用户cookie:和讯统一在用户端生成的唯一标志",  
    userid string comment "用户和讯注册ID :用户在和讯网的注册ID",   
    logserverip string comment "记录日志服务器IP : 和讯的日志收集服务器IP",  
    referer string comment "来源 :用户浏览网页的REFER",  
    requesturl string comment "访问网址 : 当前访问网址" ,  
    remark1 string comment "【暂时没用】 :该数据无意义,由于早期加入目前不能去除",  
    remark2 string comment "【暂时没用】 : 该数据无意义,由于早期加入目前不能去除",  
    alexaflag string comment "ALEXA标志  :这个字段也是早期加入,当用户安装alexa工具时值为1,否则为0.早期加入,目前来看应该没有任何意义了。",  
    ua string comment "UA :用户浏览器UA",  
    wirelessflag string comment "无线频道标志:给无线频道专用的,一个单词,表示该文章对应和讯哪一个频道"  
)   
comment "浏览轨迹日志"  
partitioned by(day string comment "按天的分区表字段",hour string comment "按小时的分区表字段")  
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '  
STORED AS ORCFILE
location '/hdfs/hive/default/kwu_tracklog';
  • 数据压缩(snappy)


SQL

优化SQL语句

  • join
语法
join_table:
    table_reference [INNER] JOIN table_factor [join_condition]
  | table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition
  | table_reference LEFT SEMI JOIN table_reference join_condition
  | table_reference CROSS JOIN table_reference [join_condition] (as of Hive 0.10)
 
table_reference:
    table_factor
  | join_table
 
table_factor:
    tbl_name [alias]
  | table_subquery alias
  | ( table_references )
 
join_condition:
    ON expression

join 分类

1、Common/Shuffle/Reduce Join

连接发生的阶段,发生在Reduce task。
大表对大表
每个表中的数据都是在文件中读取的。


2、Map Join

连接发生的阶段,发生在Map task。
小表对大表
a、大表的数据从文件中读取 cid
b、小表中的数据从内存中读取。根据cid把小表数据从内存中取出。实现方式是通过DistinctedCache


3、 SMB Join(SMB(Sort-Merge-Bucket) Join)


过程描述:排序-->合并-->入桶


关于桶的文章见Hive 基础之:分区、桶、Sort Merge Bucket Join

MapReduce

Reduce Number
JVM重用
推测执行

优化方式

  • 让hive自动判断是执行哪种join。大表对小表还是大表对小表。


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容