Hive学习笔记

  1. 创建表时,如果使用IF NOT EXISTS,而且这个已经存在的表和CREATE TABLE语句后指定的模式是不用的,Hive会忽略这个差异。也就是说只要该表名存在,hive就不会执行创建表的操作。

  2. 外部表创建分区时

    • 可以使用下面的语句创建一个或多个分区

    ALTER TABLE tablename IF NOT EXSITS
    PARTITION (col type...) LOCATION '...'
    PARTITION (col type...) LOCATION '...'
    • 也可以使用关键字OVERWRITE,如果分区不存在,则会自动创建分区目录,再将数据拷贝到该目录下

    LOAD DATA INPATH '...'
    OVERWRITE INTO TABLE tablename 
    PARTITION (col type...);
  3. 什么情况下hive可以避免进行mapreduce

    • SELECT * FROM tablename;

    • SELECT * FROM tablename WHERE 分区条件;

    • 此外最好set hive.exec.mode.local.auto=true; Hive会尝试使用本地模式执行其他操作,否则使用mapreduce执行查询

  4. LIKE和RLIKE

    查询某个字段中包含shanghai和beijing

    • like和标准sql语句中的用法一致

    select * from tb where col like '%shanghai%' or col like '%beijing%';
    • rlike是对like的扩展,可以使用正则来指定匹配条件

    select * from tb where col rlike '.*(shanghai|beijing).*';
  5. HAVING子句允许用户通过一个简单的语法完成原本需要通过子查询才能对GROUP BY语句产生的分组进行条件过滤的任务。

  6. HIVE中的JOIN语法

    • LEEF OUTER JOIN:JOIN操作符左边表中符合WHERE子句的所有记录将会返回,JOIN操作符右边表中如果没有符合ON后面连接条件的记录时,那么从右边表指定选择的列值将会是NULL

    • RIGHT OUTER JOIN:右外连接会返回右边表所有符合WHERE语句的记录。左边表中匹配不上的字段值用NULL代替

    • FULL OUTER JOIN:完全外连接会返回所有表中符合WHERE语句条件的所有记录。如果任一表的指定字段没有符合条件的值得话,那么就使用NULL值代替

    • LEFT SEMI-JOIN:左边开连接会返回左边表的记录,前提是其记录对于右边表满足ON语句中的判定条件,对于常见的内连接来说,这是一个特殊的优化了的情况。相当于SQL语言中IN ... EXISTS结构。

    • map-side JOIN:如果所有表中只有一张表是小表,可以再最大的表通过mapper的时候将小表完全放倒内存中

    • 注意:WHERE语句在连接操作执行后才会执行,因此WHERE语句应该只用于过滤那些非NULL值得列值。同时ON语句中的分区过滤条件在外连接中是无效的,不过在内连接(INNER JOIN)中是有效的。

  7. JOIN优化

    • 当对3个或者更多表进行JOIN连接时,如果每个ON子句都是用相同的连接键时,那么只会产生一个mapreduce job

    • 表的大小应从左到右依次增加,Hive在对每行记录进行连接操作室会将左边的表缓存起来

  8. 排序

    • ORDER BY:全局排序,所有数据都通过一个reducer进行处理,对于大数据集可能消耗大量时间

    • SORT BY:局部排序,数据在每个reducer中排序,可以保证每个reducer的输出数据都是有序的(但并非全局排序),这样可以提高后面的全局排序效率

  9. DISTRIBUTE BY:可以控制map的输出在reducer中如何划分,例如,我们希望具有相同股票交易码的数据在一起处理。那么我们就可以使用DISTRIBUTE BY来保证具有相同股票码的记录会分发到同一个reducer中进行处理。

  10. 类型转换:cast(value AS TYPE),可以显示的进行类型转换,需要注意的是,将浮点数转换成整数推荐使用round()或者floor()函数,而不是使用类型转换操作符cast

  11. 分区提供一个隔离数据和优化查询的便利方式,不过太多的分区可能导致一些问题:

    • 过多分区可能导致创建大量非必须hadoop文件和文件夹。由于namenode必须要将所有系统文件的元数据信息保存在内存中,过多分区产生的文件及文件夹一旦超过namenode的承受能力,系统将无法工作。

    • 一个mapreduce job包含多个task,默认情况下,每个task都是一个新JVM实例,都需要开启和销毁的开销。对于小文件,每个文件都会对应一个task,因此过多分区产生的文件使得JVM开启和销毁的时间开销可能大于时间数据处理时间。

  12. 相比分区,分桶是更细粒度的将数据集分解成更容器管理的若干部分的另一个技术。分桶有几个优点,因为桶的数量是固定的,所以它没有数据波动,桶对于抽样在适合不过。如果两个表都是按照同一个字段进行分桶的话,那么Hive可以创建一个逻辑上正确的抽样。分桶同时有利于执行高效的map-side JOIN。




你可能感兴趣的:(Hive学习笔记)