一、hive表重新合并小文件
merge_file="
set mapreduce.input.fileinputformat.split.maxsize=268435456;
set mapreduce.input.fileinputformat.split.minsize.per.node=268435456;
set mapreduce.input.fileinputformat.split.minsize.per.rack=268435456;
alter table app.search_keyword_analyise_base_v1 partition ( dt='
c
u
r
r
d
a
t
e
′
)
c
o
n
c
a
t
e
n
a
t
e
;
"
h
i
v
e
−
e
"
curr_date') concatenate; " hive -e "
currdate′)concatenate;"hive−e"merge_file"
二、Hive 查询优化
/** 一、mapper数量设置 **/
spark.sql("set mapred.min.split.size.per.node=256000000")
spark.sql("set mapred.min.split.size.per.rack=256000000")
spark.sql("set mapred.max.split.size=256000000")
解释:
:
它的主要思路是把输入目录下的大文件分成多个map的输入, 并合并小文件, 做为一个map的输入. 具体的原理是下述三步:
- 根据输入目录下的每个文件,如果其长度超过mapred.max.split.size,以block为单位分成多个split(一个split是一个map的输入),每个split的长度都大于mapred.max.split.size, 因为以block为单位, 因此也会大于blockSize, 此文件剩下的长度如果大于mapred.min.split.size.per.node, 则生成一个split, 否则先暂时保留.
- 现在剩下的都是一些长度效短的碎片,把每个rack下碎片合并, 只要长度超过mapred.max.split.size就合并成一个split, 最后如果剩下的碎片比mapred.min.split.size.per.rack大, 就合并成一个split, 否则暂时保留.
- 把不同rack下的碎片合并, 只要长度超过mapred.max.split.size就合并成一个split, 剩下的碎片无论长度, 合并成一个split.
举例: mapred.max.split.size=1000
mapred.min.split.size.per.node=300
mapred.min.split.size.per.rack=100
输入目录下五个文件,rack1下三个文件,长度为2050,1499,10, rack2下两个文件,长度为1010,80. 另外blockSize为500.
经过第一步, 生成五个split: 1000,1000,1000,499,1000. 剩下的碎片为rack1下:50,10; rack2下10:80
由于两个rack下的碎片和都不超过100, 所以经过第二步, split和碎片都没有变化.
第三步,合并四个碎片成一个split, 长度为150.
如果要减少map数量, 可以调大mapred.max.split.size, 否则调小即可.
其特点是: 一个块至多作为一个map的输入,一个文件可能有多个块,一个文件可能因为块多分给做为不同map的输入, 一个map可能处理多个块,可能处理多个文件。
// hive.map.aggr = true 是否在 Map 端进行聚合,默认为 True
// hive.groupby.mapaggr.checkinterval = 100000在 Map 端进行聚合操作的条目数目
/** 二、reducer数量设置 **/
//1 每个reduce任务处理的数据量,默认为1000^3=1G (另外 mapred.reduce.tasks可以强制指定reduce的任务数量)
spark.sql("set hive.exec.reducers.bytes.per.reducer=100000000")
//2 hive.exec.reducers.max(每个任务最大的reduce数,默认为999)
//spark.sql("set hive.exec.reducers.max=999")
//因此 计算reducer数N=min( hive.exec.reducers.max ,总输入数据量/ hive.exec.reducers.bytes.per.reducer )
/** 三、设置小文件合并 **/
//map输出文件合并
spark.sql("set hive.merge.mapfiles=true")
//reduce输出文件合并
spark.sql("set hive.merge.mapredfiles=true")
//合并文件的大小
spark.sql("set hive.merge.size.per.task=256000000")
/** 四、解决数据倾斜:分为两个MR job **/
spark.sql("set hive.groupby.skewindata=true")
三、快速copy一个table
新建一个表 create table t2 like t1;
复制hdfs分区文件 hdfs dfs -cp dir_t1/* dir_t2/
在hive中修复分区 MSCK REPAIR TABLE t2;
**
修改表location并且迁移已有数据:
- 复制hdfs文件
- use app; alter table app_szsf_algo_pin_search_short_da partition(dt=‘2019-08-28’) set location “hdfs://ns1016/user/jd_ad/ads_polaris/feature_engeering/app_szsf_algo_pin_search_short_da/dt=2019-08-28” ;
- 注意:不可以用app. 会报错
四、Hive 不等于<> 和 != 陷阱
hive中的不等于符号 <>和!=基本同等作用。但是存在某种情况下查询无结果:
int <> 'string' 或者 int != 'string'
例如: 1 != '1' , 1<>'' 等,并不会报错,但是无返回结果!!!
五、hive和spark读表的block, partitions, cores等概念
https://blog.csdn.net/u013013024/article/details/72876427#comments
六、Join predict pushdown机制ppd
- http://allabouthadoop.net/what-is-predicate-pushdown-in-hive/
- https://blog.csdn.net/strongyoung88/article/details/81156271
- https://cwiki.apache.org/confluence/display/Hive/OuterJoinBehavior#OuterJoinBehavior-CaseW1:WherePredicateonPreservedRowTable
- left join on只会提前过滤右表,左表不受影响全部都会出来;where会提前过滤左表,但是不会提前过滤右表