0.HiveQL不完全兼容PL-SQL,T-SQL,ANSI-SQL,既有大多数ANSI-SQL语法特征,也有类似T-SQL的case-when-then用法.差异之处部分如存在ANSI-SQL不允许的判断相等的'=='谓词符号,存在from tb_name select *;的写法,存在map-side join链接查询,UDF.HQL是读时模式:在读取数据的时候,进行错误检查等操作.hive不支持行插入,hbase满足这个要求.
1.hive没有键的概念.PARTITION分区表有利于加快查询,但需要设置为strict模式通过需要分区过滤,hive>set hive.mapred.mode = strict,分区过滤即在where子句中对分区键进行谓词符(<,>=,is null...)操作.
2.每个分区键对应本地目录下的一个文件夹,所以复制数据的时候,拷贝对应文件夹的内容即可:hadoop fs -cp s_path ,d_path.
3.外部表的元数据格式会被删除,但表数据不会被删除.外部表相对于管理表在访问权限上更自由,可以被多个ETL工具访问.
4. 可以自定义数据存储格式,也有MAP,ARRAY,STRUCT等复杂的数据结构,在ANSI-SQL可以利用json.dump,json.loads存取复杂的数据.在定义UDF时,对于简单的数据类型如Integer,String选择UDF,对于复杂类型如MAP,ARRAY选择GenericUDF,二者分别import不同的package.
5.HIVE设置本地模式避免创建MAPREDUCE任务.不需要进行联网分发任务只要读取本地的warehouse.dir目录下的文件即可.set hive.exec.mode.local.auto=true;
6.LIKE,RLIKE.LIKE通配符一般使用%,-,[],[^],显然不如RLIKE可以使用java的regexp强大.
7.优化:1)join优化:hive假定join查询位于最后的表是最大的表,其他的表进行缓存.对于select * from a join b join c我们应该c表是a,b,c中数据量最大的表.2)查询优化:如1中说的增加分区过滤器(对分区键谓词操作.3)sort by 代替order by,前者局部排序,后者全局排序.
8.使用explan+hql查看hql的ast来分析执行过程.
9.hive thrift:支持c++,java等多种语言,客户端访问服务器hive服务器的接口框架,和为消息队列服务提供接口服务的消息框架rabbitMQ,ZMQ类似.
10.存储过程,可用于静态编译执行,将写好的sql语句集合成块地调用执行.hql编译过程见美团博客:http://tech.meituan.com/hive-sql-to-mapreduce.html
待续~
参考
[1] hive编程指南:http://book.douban.com/subject/25791255
[2] hive存储过程.http://lxw1234.com/archives/2015/09/492.htm,http://blog.matthewrathbone.com/2013/08/10/guide-to-writing-hive-udfs.html
[3] 基于hadoop的8种SQL接口框架:http://blog.matthewrathbone.com/2014/06/08/sql-engines-for-hadoop.html