以下内容记录了《Hive编程指南》各个章节的主要知识要点,内容会不定期增加
第3章 数据类型和文件格式
Hive支持基本数据类型和struct、map、array三种集合类型,三种集合类型的数据在文件存储时将使用不同的分隔符,默认的记录和字段分割符如表3-3所示(p44),分割符还可以由用户自行定义(p46上方语句)。
传统数据库是写时模式,即数据在写入数据库时对模式进行检查,如果写入的数据与定义的模式不对,将会报错,hive是读时模式,即写入数据时不会对模式进行检查,在读数据的时候,如果模式和文件内容不匹配,将会极力尝试将各种错误恢复过来,如果每行记录的字段个数小于定义的字段个数,那么没有数据的字段将显示null。
第4章 HiveQL:数据定义
Hive不支持行级插入、更新、删除操作,也不支持事务。
创建数据库或表时,最好使用if not exists,删除时使用if exists。
Hive默认的数据库目录是/user/hive/warehourse/*.db/table_name/partition_name,用户也可以使用location指定位置(p50)。
创建数据库时可以使用comment命令添加注释,可以使用desc database db_name命令可以查看数据库的描述信息及存储位置,更进一步,可以使用with dbproperties为数据库增加键-值对属性信息,这个命令很有用,参考p51。
Hive不允许用户删除一个包含有表的数据库。
desc formatted table_name可以查看表的详细信息,包括字段、存储位置、创建人、创建时间等,p53提到的last_modified_by和last_modified_time属性没有看到,是因为用户没有自定义表属性,所以这两个属性不会显示在表的详细信息中(p55)。
如果用户不想使用默认的表路径,那么最好使用外表。
第5章 HiveQL: 数据定义
修改column属性(列名,列字段类型,列注释):
ALTER TABLE table_name
CHANGE [COLUMN] col_old_name col_new_name
column_type [COMMENT col_comment] [FIRST|AFTER column_name]
第6章 HiveQL: 查询
select之后的表达式可以是列名、列名的某种索引、正则表达式、算术表达式、内置基本函数、内置聚合函数、表生成函数以及用户自定义函数。
Hive内置的函数有很多,需要在使用中慢慢熟悉(p82-92)。
使用列别名和表别名是非常有用的(p93)。
case...when...then句式的用法(p93)。
在$HOME/./hiverc配置文件中增加set hive.exec.mode.loacl.auto=true可以使得hive可能避免进行MapReduce,否则所有查询都将使用MapReduce来执行(p94)。
不能在where语句中使用列别名(p95),但可以使用表别名,where中可以使用LIKE和RLIKE谓词操作符,LIKE只能用于SQL下的简单正则表达式比较,RLIKE可使用复杂的java正则表达式,select之后的表达式也可以使用SQL下的简单正则表达式。
GROUP BY语句通常会和聚合函数一起使用,按照一个或者多个列对结果进行分组,然后对每个组执行聚合操作。
having也是用于条件过滤,但与where不同的是,having是与group by搭配使用,对group by产生的分组进行条件过滤,与where的区别与联系,见p100。
Hive支持通常的sql join语句,但仅支持等值连接,不支持sql的非等值连接(p101)。
多表连接不懂(p102)。
使用关键字join,但不指定join key时,将进行笛卡尔积连接,使用cross join显示指定笛卡尔连接,要使用内连接最好使用inner join,而不是join,如果使用join on,到底是直接执行内连接,还是先笛卡尔连接再过滤?(p108提示上方)
最好设置属性hive.mapred.mode为ture,因为hive中的表都很大,笛卡尔积的结果更大, 将会消耗很多时间。
map-side join主要于为了优化join查询,将小表直接放入内存中,只进行map,不进行reduce,没看懂(p108)。
order by将对查询结果进行全局排序,sort by只对每个reducer中的结果进行排序,如果一次查询中reducer的个数为1,那么两种方法的结果是一样的,否则不一样。sort by只对每个reducer中的结果进行排序,这样可能导致不同reducer中输出的结果是重复的,distribute by可以解决这个问题,它控制map的输出在reducer中是如何划分的,可以保证相同字段的记录分配到同一个reducer中(p111),这样可以保证输出的数据是全局排序的,但是会失去sort by的并行性(p112)。
cast(value AS TYPE)可进行数据类型转换,但是浮点数转换为整数的推荐方式是使用round()和floor(),cast转换还可以嵌套(p113)。
抽样查询没有弄明白(p113)。
union all可对两个或多个临时表进行合并,union all的左右两个临时表都需要是子查询,且字段、字段类型一致,且union之后的结果需要一个别名。
第13章 函数
hive行转列与列转行,http://blog.csdn.net/jthink_/article/details/38853573
hive UDF、UDAF、UDTF,http://blog.csdn.net/longzilong216/article/details/23921235