[hive]hive结果表中每500万条记录生成一个文件(不适合KBase数据)

在生成kbase数据时出现的问题

drop table ads.ads_distinct_zhibiao_nian_diqu;
create table ads.ads_distinct_zhibiao_nian_diqu
(
    top string,
    years string,
    zheng_shi_indicator string,
    zheng_shi_indicator_old string,
    di_qu_dai_ma string,
    di_qu_deng_ji string,
    di_yu_lei_xing_dai_ma string,
    reportgrouper string,
    reportgrouper_old string,
    zheng_shi_value string,
    zheng_shi_unit string,
    zheng_shi_value_old string,
    zheng_shi_unit_old string,
    wen_ben_wen_jian_ming string,
    nian_jian_zhong_wen_ming string,
    nian_jian_nian_fen string,
    tiao_mu_ti_ming string,
    bian_hao string,
    ru_ku_biao_shi string,
    yin_shua_ye_ma string,
    fu_qin_jie_dian string,
    guo_biao_di_yu_dai_ma string
)
row format delimited
fields terminated by "\n"
;


insert overwrite table ads.ads_distinct_zhibiao_nian_diqu
select
    "<REC>" as top,
    concat("<年份>=",years) years ,
    concat("<正式指标>=",zheng_shi_indicator) zheng_shi_indicator,
    concat("<正式指标_OLD>=",zheng_shi_indicator_old) zheng_shi_indicator_old,
    concat("<地区代码>=",di_qu_dai_ma) di_qu_dai_ma,
    concat("<地区等级>=",di_qu_deng_ji) di_qu_deng_ji,
    concat("<地域类型代码>=",di_yu_lei_xing_dai_ma) di_yu_lei_xing_dai_ma,
    concat("<REPORTGROUPER>=",reportgrouper) reportgrouper,
    concat("<REPORTGROUPER_OLD>=",reportgrouper_old) reportgrouper_old,
    concat("<显示数值>=",zheng_shi_value) zheng_shi_value,
    concat("<显示单位>=",zheng_shi_unit) zheng_shi_unit,
    concat("<显示数值_OLD>=",zheng_shi_value_old) zheng_shi_value_old,
    concat("<显示单位_OLD>=",zheng_shi_unit_old) zheng_shi_unit_old,
    concat("<文件名X>=",wen_ben_wen_jian_ming) wen_ben_wen_jian_ming,
    concat("<年鉴中文名X>=",nian_jian_zhong_wen_ming) nian_jian_zhong_wen_ming,
    concat("<年鉴年份X>=",nian_jian_nian_fen) nian_jian_nian_fen,
    concat("<条目题名X>=",tiao_mu_ti_ming) tiao_mu_ti_ming,
    concat("<编号X>=",bian_hao) bian_hao,
    concat("<入库标识X>=", ru_ku_biao_shi)  ru_ku_biao_shi,
    concat("<印刷页码X>=",yin_shua_ye_ma) yin_shua_ye_ma,
    concat("<父亲节点X>=",fu_qin_jie_dian) fu_qin_jie_dian,
    concat("<国标地域代码>=",guo_biao_di_yu_dai_ma) guo_biao_di_yu_dai_ma
from
    dws.dws_distinct_zhibiao_nian_diqu
;

ads.ads_distinct_zhibiao_nian_diqu字段间分隔符是"\n"。

本来我这样写是没问题的。但开启合并小文件,程序是怎么样运行的呢?

首先运行我的插入语句。之后另开启了一个MR,将我的ads进行聚合,由于ads表为\n分隔的表,因此它在读取时,认为数据只有一列,且其他列为\n,导致KBase最终结果为

一.在字段间分隔符正常的情况下

没设置之前的结果为22个 

先测试运行一下,看结果表中一条记录是多大

 751*500万=3755000000 kb

即生成的结果文件一个应为3755000000 kb

set hive.merge.mapredfiles=true;
--对mr进行设置
set hive.merge.mapfiles=true;
--only-map进行设置
set hive.merge.smallfiles.avgsize=1024000000;
--1g
set hive.merge.size.per.task=3755000000;
--合并后每个文件的目标大小 3755m

create table if not exists ads.ads_distinct_zhibiao_nian_diqu
(
    top string,
    years string,
    zheng_shi_indicator string,
    zheng_shi_indicator_old string,
    di_qu_dai_ma string,
    di_qu_deng_ji string,
    di_yu_lei_xing_dai_ma string,
    reportgrouper string,
    reportgrouper_old string,
    zheng_shi_value string,
    zheng_shi_unit string,
    zheng_shi_value_old string,
    zheng_shi_unit_old string,
    wen_ben_wen_jian_ming string,
    nian_jian_zhong_wen_ming string,
    nian_jian_nian_fen string,
    tiao_mu_ti_ming string,
    bian_hao string,
    ru_ku_biao_shi string,
    yin_shua_ye_ma string,
    fu_qin_jie_dian string,
    guo_biao_di_yu_dai_ma string
)
    row format delimited
    fields terminated by "\n"
;


insert overwrite table ads.ads_distinct_zhibiao_nian_diqu
select
    "<REC>" as top,
    concat("<年份>=",years) years ,
    concat("<正式指标>=",zheng_shi_indicator) zheng_shi_indicator,
    concat("<正式指标_OLD>=",zheng_shi_indicator_old) zheng_shi_indicator_old,
    concat("<地区代码>=",di_qu_dai_ma) di_qu_dai_ma,
    concat("<地区等级>=",di_qu_deng_ji) di_qu_deng_ji,
    concat("<地域类型代码>=",di_yu_lei_xing_dai_ma) di_yu_lei_xing_dai_ma,
    concat("<REPORTGROUPER>=",reportgrouper) reportgrouper,
    concat("<REPORTGROUPER_OLD>=",reportgrouper_old) reportgrouper_old,
    concat("<显示数值>=",zheng_shi_value) zheng_shi_value,
    concat("<显示单位>=",zheng_shi_unit) zheng_shi_unit,
    concat("<显示数值_OLD>=",zheng_shi_value_old) zheng_shi_value_old,
    concat("<显示单位_OLD>=",zheng_shi_unit_old) zheng_shi_unit_old,
    concat("<文件名X>=",wen_ben_wen_jian_ming) wen_ben_wen_jian_ming,
    concat("<年鉴中文名X>=",nian_jian_zhong_wen_ming) nian_jian_zhong_wen_ming,
    concat("<年鉴年份X>=",nian_jian_nian_fen) nian_jian_nian_fen,
    concat("<条目题名X>=",tiao_mu_ti_ming) tiao_mu_ti_ming,
    concat("<编号X>=",bian_hao) bian_hao,
    concat("<入库标识X>=", ru_ku_biao_shi)  ru_ku_biao_shi,
    concat("<印刷页码X>=",yin_shua_ye_ma) yin_shua_ye_ma,
    concat("<父亲节点X>=",fu_qin_jie_dian) fu_qin_jie_dian,
    concat("<国标地域代码>=",guo_biao_di_yu_dai_ma) guo_biao_di_yu_dai_ma
from
    dws.dws_distinct_zhibiao_nian_diqu
;

 结果

因为是用一条记录的大小计算500条记录的总大小,如果其中有些记录的大小<我门查看的那条记录的大小,则跑出的结果会大于500万。建议是取多条记录,计算他们的平均值。

二.知识点

查询官网

Configuration Properties - Apache Hive - Apache Software Foundation

1.有三个对reduce task设定的参数

mapred.reduce.tasks
强制指定reduce个数
默认值:-1
添加于:Hive 0.1.0
通过将此属性设置为 -1,Hive 将自动计算出reduce task的数量。

hive.exec.reducers.bytes.per.reducer
每个reduce task处理的最大数据量
Hive 0.14.0 及更高版本中为256,000,000 即256 MB
也就是说,如果输入大小为 1 GB,则将使用 4 个 reducer。

hive.exec.reducers.max
每个job最大的reduce task个数
默认值:1009 在 Hive 0.14.0 及更高版本中
每个job 的最大reducer 数量。

对上述3个参数进行设定

set mapred.reduce.tasks=1;
set hive.exec.reducers.max=1
set hive.exec.reducers.bytes.per.reducer=10240000000(10g)

drop table test.a
create table test.a as
select * from test.test_distinct;

无效。

无效原因:

insert t1 select * from t2

create table t1 as select * from t2

这两种方式都不走mr,所以没用

2.使用合并小文件参数

1.hive.merge.smallfiles.avgsize
默认值:16000000(16m)
添加于:Hive 0.5.0
当作业的平均输出文件大小小于此数字时,Hive 将启动额外的 map-reduce 作业以将输出文件合并为更大的文件。

2.hive.merge.mapfiles   
为 true,则[1.]对 map-only 作业执行此操作;

3.hive.merge.mapredfiles
为 true,则对 map-reduce 作业执行此操作。

4.hive.merge.size.per.task
默认值:256000000(256m)
添加于:Hive 0.4.0
合并后文件的大小。

1.仅设置合并后的文件大小

set hive.merge.mapfiles=true;
set hive.merge.size.per.task=2048000000;
--2g

drop table test.b;
create table test.b as
select * from test.a;

无效! 

2.设置合并多大的文件和合并后文件大小

set hive.merge.mapfiles=true;
set hive.merge.smallfiles.avgsize=2048000000;
--2g
set hive.merge.size.per.task=2048000000;
--2g

drop table test.b;
create table test.b as
select * from test.a;

有效!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值