Hive应用开发建议
HQL编写之隐式类型转换
查询语句使用字段的值做过滤时,不建议通过Hive自身的隐式类型转换来编写HQL。因为隐式类型转换不利于代码的阅读和移植。
建议示例:
select * from default.tbl_src where id = 10001; select * from default.tbl_src where name = 'TestName';
不建议示例:
select * from default.tbl_src where id = '10001'; select * from default.tbl_src where name = TestName;
表tbl_src的id字段为Int类型,name字段为String类型。
HQL编写之对象名称长度
HQL的对象名称,包括表名、字段名、视图名、索引名等,其长度建议不要超过30个字节。
Oracle中任何对象名称长度不允许超过30个字节,超过时会报错。PT为了兼容Oracle,对对象的名称进行了限制,不允许超过30个字节。
太长不利于阅读、维护、移植。
HQL编写之记录个数统计
统计某个表所有的记录个数,建议使用“select count(1) from table_name”。
统计某个表某个字段有效的记录个数,建议使用“select count(column_name) from table_name”。
JDBC超时限制
Hive提供的JDBC实现有超时限制,默认是5分钟,用户可以通过java.sql.DriverManager.setLoginTimeout(int seconds)设置,seconds的单位为秒。
UDF管理
建议由管理员创建永久UDF,避免每次使用时都去add jar,和重新定义UDF。
Hive的UDF会有一些默认属性,比如“deterministic”默认为“true”(同一个输入会返回同一个结果),“stateful”(是否有状态,默认为“true”)。当用户实现的自定义UDF内部实现了汇总等,需要在类上加上相应的注解,例如如下类:
@UDFType(deterministic = false) Public class MyGenericUDAFEvaluator implements Closeable {
表分区优化建议
- 当数据量较大,且经常需要按天统计时,建议使用分区表,按天存放数据。
- 为了避免在插入动态分区数据的过程中,产生过多的小文件,在执行插入时,在分区字段上加上distribute by。
存储文件格式优化建议
Hive支持多种存储格式,比如TextFile,RCFile,ORC,Sequence,Parquet等。为了节省存储空间,或者大部分时间只查询其中的一部分字段时,可以在建表时使用列式存储(比如ORC文件)。