1. 内部表和外部表的区别
- 导入数据语句一样(load data (local) inpath ‘’ into table tablename)
- 删除表时,内部表会删除表的元数据和数据,但外部表只会删元数据
2. sql优化
- 查询中不要的column不要写
- where条件判断在全表扫描的过滤
- 只读指定partition的数据
- 调整join顺序,以大表做驱动表,小表存内存
- map端用hash聚合,减少reduce端的数据处理规模
- 控制map和reduce个数
3. 数据倾斜
什么是数据倾斜:计算时,data多散度不够,导致大量data冲到一台或几台服务器上计算
spark中的数据倾斜
-
exeator lost、com、shuffle过程出错
-
driver com
-
单个exeator执行很大,整个任务卡住
正常运行任务突然失败 -
sql如join
count(distinct) group by
解决:
- 从业务逻辑上,单独考虑发生倾斜的数据
- 从程序上,如hive中count(distinct),只有一个reduce,可以先在外面group 在count
- 调参:临时目录、exeator、cores、memory等
- 数据分布:均匀上传或异常数据处理
处理:
方法1:找到并过滤
方法2:对分布不均的单独弄;对key做hash,先打散在聚集
方法3:数据预处理
优化:
hadoop
- map join方式
- left semi join
- count distinct,先group 在count
- 设hive.group by.skewindata=true避免数据倾斜,将1个job分为2个,只有在count和count distinct,才有作用
- 设置map端,中间结果压缩,不仅可解决数据倾斜,还可以减少IO读写和网络传输
spark
- mapjoin方式
- 增加并行度,减少序列化反序列化负担
- 合理设置drive的内存
- 优化spark sql与hive类似
hive
- 分区,设置动态分区
- 减少存储空间和ID 压缩数据(压缩map和中间结果等)
- hive中间表以sequencefile保存,节约序列化和反序列化空间,
hive.query.result.filter=sequenctfile - yarn优化
sql
- rank:按照排序生成排名,相同字段不去重
select rank() over(order by [time] desc) from tablename; - row-number:按照排序生成排名,相同字段顺序往下
①排名算法必须有over子句
②排名函数必须有含order by 的over子句 - join
内连接
外连接
左半连接:前面为全表,返回主表中k在副表的记录,相当于in或exists
hive的join只支持相等连接,不支持不等连接
如select * from a join b on a.id<>b.id;