
# 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;
```
![](https://support.huaweicloud.com/devg-rule-mrs/public_sys-resources/note_3.0-zh-cn.png)
表tbl_src的id字段为Int类型，name字段为String类型。
#### HQL编写之对象名称长度
HQL的对象名称，包括表名、字段名、视图名、索引名等，其长度建议不要超过30个字节。
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文件）。
