一、创建表

- 创建表时ROW FORMAT DELIMITED 必须写在其他子句之前(除了STORED AS...)

- 设置列分隔符:FIELDS TERMINATED BY '\001'

- 设置集合元素间分隔符:COLLECTION ITEMS TERMINATED BY '\002'

- 设置map键和值之间的分隔符:MAP KEYS TERMINATED BY '\003'

二、读时模式
         Hive不具有对数据内容的完全支配能力,只拥有查询的能力,不能添加或者更新,它更适合大批量数据的导入。
         传统数据库是写时模式,即数据在写入数据库时对模式进行检查,而Hive是在查询时进行检查,成为读时模式。Hive会对查询结果中的缺省值自动填充null。

三、默认属性
         hive表会自动增加俩个属性,一个是last_modified_by,其保存的是最后修改这个表的用户,一个是last_modified_time,其保存着最后一次修改的新纪元时间。

四、表与外部表的区别
         hive中外部表创建时需要添加关键字EXTERNAL,并且会通过LOCATION指出数据存储路径。
         删除表会删除表、元数据及表中所包含数据,外部表只会删除表、元数据。

五、数据加载
         一般为大批量数据装载,如果加入了LOCAL 就是从本地文件系统向hdfs上拷贝,如果不加则源路径是hdfs上路径,并且是将数据移动到目标路径下,这样就要求两个路径都在同一个文件系统中,所以LOAD DATA是不能在不同集群间装载数据。
         LOAD DATA 会将数据移动到表名下,而如果有其他表共享该数据,则可以创建外部表。
         增加OVERWRITE就不会覆盖之前的同名文件。
         源路径下不允许存在文件夹,hive不会验证装载的数据与表模式是否一致,而是验证文件格式是否和表结构定义的一致。

六、分区外部表与非分区外部表
         创建非分区外部表时要求指定LOCATION子句,而对于外部分区表可以通过ALTER TABLE单独增加分区,同时指定数据路径。

七、Hive优化策略(没有弄清楚)

- 使用Partition减少扫描数量

- 使用Map段Join

- 配置Reduce数量
- xml,json提前,适用脚本提取,而非使用函数、

- 使用INSERT INTO LOCAL DIRECTORY '本地路径', 而非使用HiveServer

- 使用LZO压缩存储数据

- 适用外部表,而非内部表
- hive.exec.compress.output = false, true

- 使用队列管理任务执行

八、自定义UDF

- extends org.apache.hadoop.hive.ql.UDF

- 实现evaluate函数,evaluate函数支持重载

- 将程序打包

- 在hive中添加jar包(add jar j ar包路径)

- 创建临时函数,定义方法名(CREATE TEMPORARY FUNCTION <函数名> AS ‘java类名’)
- HQL中使用自定义的UDF

- 销毁临时函数(DROP TEMPORARY FUNCTION <函数名>)

九、自定义UDAF

- extends org.apache.hadoop.hive.ql.exec.UDAF

- 包含一个或多个实现了org.apache.hadoop.hive.ql.UDAFEvaluator的嵌套类

- 在嵌套类中实现了五个方法
    - init()方法:负责初始化计算函数并重设它的内部状态
    - iterate()方法:每对一个新值计算时都会调用该方法,用于更新结果
    - terminatePartial()方法:需要部分聚集结果时会返回聚集结果对象
    - merge()方法:合并一个部分聚集值和另一个聚集值时调用
    - terminate()方法:返回最终结果

十、Hive执行MR

-  用explain+执行语句

- 不执行MR:
    - select * from table

    - 带分区时,直接查询分区