一、创建表
- 创建表时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
- 带分区时,直接查询分区
- 创建表时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
- 带分区时,直接查询分区