insert into和override write的区别
(1)问题分析
考官主要考核你对hive基础的理解,是否具有hive开发的经验。
(2)核心问题讲解
插入的数据:
001 20 zhangsan
insert into 语句是将某一张表中的数据写到另一张表中。即insert into table account select id,age,name from account_tmp;
insert overwrite语句是覆盖之前的内容;insert overwrite table account2 select id,age,name from account_tmp;
两者的区别:
insert overwrite 会覆盖已经存在的数据,假如原始表使用overwrite 插入的数据,先将原始表的数据remove,再插入新数据。最后表的数据 只有001 20 zhangsan这一条记录。
insert into 只是简单的插入,不考虑原始表的数据,直接追加到表中。最后表的数据是原始数据和新插入的 001 20 zhangsan都有。
总结
insert into 与 insert overwrite 都可以向hive表中插入数据,但是insert into直接追加到表中数据的尾部,而insert overwrite会重写数据,既先进行删除,再写入。如果存在分区的情况,insert overwrite会只重写当前分区数据。
(3)问题扩展
Hive可以采取分区表和分桶表进行优化。
分区是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表的内容巨大,在查询时进行全表扫描耗费的资源非常多。那其实这个情况下,我们可以按照日期对数据表进行分区,不同日期的数据存放在不同的分区,在查询时只要指定分区字段的值就可以直接从该分区查找。
分桶是相对分区进行更细粒度的划分。分桶将整个数据内容按照某列属性值的hash值进行区分,如要按照name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。
区别
1)分桶随机分割数据库,分区是非随机分割数据库。因为分桶是按照列的哈希函数进行分割的,相对比较平均;而分区是按照列的值来进行分割的,容易造成数据倾斜。
2)分桶是对应不同的文件(细粒度),分区是对应不同的文件夹(粗粒度)。桶是更为细粒度的数据范围划分,分桶的比分区获得更高的查询处理效率,使取样更高效。
3)注意:普通表(外部表、内部表)、分区表这三个都是对应HDFS上的目录,桶表对应是目录里的文件。
(4)结合项目中使用
按天抽取数据的时候,可以按天分区,然后使用insert overwrite进行数据的插入,将当天的数据覆盖同步;如果是细粒度的增量更新数据,则可以使用insert into。