在生成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;
有效!