避免数据倾斜
参数调节:
hive.map.aggr=true
Map 端部分聚合,相当于Combiner
hive.groupby.skewindata=true
有数据倾斜的时候进行负载均衡,当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。
SQL语句调节:如何Join:
关于驱动表的选取,选用join key分布最均匀的表作为驱动表
做好列裁剪和filter操作,以达到两表做join的时候,数据量相对变小的效果。
大小表Join:使用map join让小的维度表(1000条以下的记录条数) 先进内存。在map端完成reduce.
大表Join大表:把空值的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终结果。
count distinct大量相同特殊值
countdistinct时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在最后结果中加1。如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union。
group by维度过小:采用sum() group by的方式来替换count(distinct)完成计算。
特殊情况特殊处理:在业务逻辑优化效果的不大情况下,有些时候是可以将倾斜的数据单独拿出来处理。最后union回去。
由微观到宏观,逐层分析。首先我们从微观来看,如何给用户的微观画像进行分级呢?如下图所示。
总原则:基于一级分类上述分类逐级进行细分。
• 第一分类:人口属性、资产特征、营销特性、兴趣爱好、购物爱好、需求特征
• 第二分类...
• 第三分类...
• .......
•
生成决策树的个数、分裂属性的个数
randomForest包中的randomForest(formula, data,ntree, nPerm, mtry, proximity, importace)函数:随机森林分类与回归。ntree表示生成决策树的数目(不应设置太小,默认为500);nPerm表示计算importance时的重复次数,数量大于1给出了比较稳定的估计,但不是很有效(目前只实现了回归);mtry表示选择的分裂属性的个数;proximity表示是否生成邻近矩阵,为T表示生成邻近矩阵;importance表示输出分裂属性的重要性。
控制下面几个参数选择最佳的模型
minsplit控制一个节点最小权重和以便进行分割;minbusket设置了一个叶子节点最小权重和;maxsurrogate表示替代分裂点的数量以便用于评估;maxdepth控制决策树的深度。其中,minsplit/minbusket可以设置为训练集的1/100,这些参数的值可以根据商业问题、领域专家的经验、数据、执行算法需要的合理时间以及决策树的期望规模来设置。
层次距离选择,通过距离矩阵来聚类
1)10 5 2 1 四人过桥的时间,一次只能过两人,只有一个手电筒,每次过桥需要用到手电筒,最少的过桥时间
2)5 升 3升两个容量大小的杯子,怎么倒出4升水
3)有 有 有 无 无 无,有表示杯子中有水,无表示杯子中无水;只能动一个杯子的情况下,使有水和无水相间隔
4)1到100已经标记并从小到大排好序的小球,两个人按顺序抽取,一次可以抽取1到5个球,如果让你先抽,什么情况下保证你永远都能抽取到第100号球。
5)九宫格
9、数据挖掘的系统架构
10、sparkR是不是每台机器上都需要安装并加载包;spark的工作流程,RDD的
Spark优化,actor操作与线程的优化
11、用户画像的标签系统多久更新一次
12、GBM,梯度下降的条件:必须是 凸函数
13、hashmap的原理
14、二分法查找
15、aabbcddfchgh找出只出现一次的字母
16、一段文件分好词后并按次序放入到一个list中,求出I love China的最短距离,不考虑大小写(使用指针)
17、应用算法的具体业务流程
18、贝叶斯公式、贝叶斯文本分类
19、m行n列的日志,统计列数为6的行数
20、欧式距离与余弦距离的区别
21、组合索引的区别:A和B上建立组合索引,查询AB、A和B 哪个最快、哪个最慢 AB>A>B
22、表连接查询,小表在前的原理,map join与其他join的区别
Mapjoin是一种避免避免数据倾斜的手段
允许在map阶段进行join操作,MapJoin把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map是进行了join操作,省去了reduce运行的效率也会高很多
在《hive:join遇到问题》有具体操作
在对多个表join连接操作时,将小表放在join的左边,大表放在Jion的右边,
在执行这样的join连接时小表中的数据会被缓存到内存当中,这样可以有效减少发生内存溢出错误的几率