HIVE常见面试题
hive内部表与外部表的区别?
1、未被external修饰的是内部表(managed table),被external修饰的为外部表(external table);
2、内部表数据由Hive自身管理,外部表数据由HDFS管理;
3、内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定(如果没有LOCATION,Hive将在HDFS上的/user/hive/warehouse文件夹下以外部表的表名创建一个文件夹,并将属于这个表的数据存放在这里);
4、删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;
5、对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)
6、修改外部表想要生效,需要先把外部表转内部表,然后修改,再转外部表。
产生数据倾斜的业务场景及解决办法:
1)空值产生的数据倾斜
在日志中,常会有信息丢失的问题,比如日志中的 user_id,如果取其中的 user_id 和用户表中的 user_id 相关联,就会碰到数据倾斜的问题。
解决方案 1:user_id 为空的不参与关联
解决方案 2: 赋予空值新的 key 值
把空值的 key 变成一个字符串加上一个随机数,就能把造成数据倾斜的数据分到不同的 reduce 上解决数据倾斜的问题。
2)不同数据类型关联产生数据倾斜
用户表中 user_id 字段为 int,log 表中 user_id 为既有 string 也有 int 的类型, 当按照两个表的 user_id 进行 join 操作的时候,默认的 hash 操作会按照 int 类型的 id 进行分配,这样就会导致所有的 string 类型的 id 就被分到同一个 reducer 当中。
解决方案:转换为相同数据类型
3)大小表关联查询产生数据倾斜
使用map join让小的维度表(1000条以下的记录条数)先进内存。在map端完成进行join操作。
hive保存元数据的方式及优缺点:
存储于 derby数据库,此方法只能开启一个hive客户端,不推荐使用
存储于mysql数据库中,可以多客户端连接,推荐使用