Hive数据类型 | Java数据类型 | 长度 | 例子 |
---|---|---|---|
TINYINT | byte | 1byte有符号整数 | 20 |
SMALINT | short | 2byte有符号整数 | 20 |
INT | int | 4byte有符号整数 | 20 |
BIGINT | long | 8byte有符号整数 | 20 |
BOOLEAN | boolean | 布尔类型,true或者false | TRUE FALSE |
FLOAT | float | 单精度浮点数 | 3.14159 |
DOUBLE | double | 双精度浮点数 | 3.14159 |
STRING | string | 字符系列。可以指定字符集。可以使用单引号或者双引号。 | ‘now is the time’ “for all good men” |
TIMESTAMP | 时间类型 | ||
BINARY | 字节数组 |
注意:
Hive中的String类型相当于数据库的varchar类型,是一个可变的字符串,但是在Hive中不能声明其中最多能存储多少个字符,理论上它可以存储2GB的字符数。
Hive有三种复杂数据类型ARRAY、MAP 和 STRUCT。
ARRAY和MAP与Java中的Array和Map类似,而STRUCT与C语言中的Struct类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。
数据类型 | 描述 | 语法 | 示例 |
---|---|---|---|
STRUCT | 和c语言中的struct类似,都可以通过“点”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, last STRING},那么第1个元素可以通过字段.first来引用。 | struct() | struct |
MAP | MAP是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素 | map() | map |
ARRAY | 数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第2个元素可以通过数组名[1]进行引用。 | Array() | array |
Hive的原子数据类型是可以进行隐式转换的,类似于Java的类型转换。
例如:某表达式使用INT类型,TINYINT会自动转换为INT类型;
但是Hive不会进行反向转化,例如,某表达式使用TINYINT类型,INT不会自动转换为TINYINT类型,它会返回错误,除非使用CAST操作。
1)隐式类型转换规则如下:
(1)任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT。
(2)所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE。
(3)TINYINT、SMALLINT、INT都可以转换为FLOAT。
(4)BOOLEAN类型不可以转换为任何其它的类型。
2)可以使用CAST操作显示进行数据类型转换
例如CAST(‘1’ AS INT)将把字符串’1’ 转换成整数1;如果强制类型转换失败,如执行CAST(‘X’ AS INT),表达式返回空值 NULL。
1. unix_timestamp: 返回当前或指定时间的时间戳
select unix_timestamp();
select unix_timestamp("2020-10-28",'yyyy-MM-dd');
2. from_unixtime:将时间戳转为日期格式
select from_unixtime(1603843200);
3. current_date:当前日期
select current_date;
4. current_timestamp:当前的日期加时间
select current_timestamp;
5. to_date:抽取日期部分
select to_date('2020-10-28 12:12:12');
6. year:获取年
select year('2020-10-28 12:12:12');
7. month:获取月
select month('2020-10-28 12:12:12');
8. day:获取日
select day('2020-10-28 12:12:12');
9. hour:获取时
select hour('2020-10-28 12:13:14');
10. minute:获取分
select minute('2020-10-28 12:13:14');
11. second:获取秒
select second('2020-10-28 12:13:14');
12. weekofyear:当前时间是一年中的第几周
select weekofyear('2020-10-28 12:12:12');
13. dayofmonth:当前时间是一个月中的第几天
select dayofmonth('2020-10-28 12:12:12');
14. months_between: 两个日期间的月份
select months_between('2020-04-01','2020-10-28');
15. add_months:日期加减月
select add_months('2020-10-28',-3);
16. datediff:两个日期相差的天数
select datediff('2020-11-04','2020-10-28');
17. date_add:日期加天数
select date_add('2020-10-28',4);
18. date_sub:日期减天数
select date_sub('2020-10-28',-4);
19. last_day:日期的当月的最后一天
select last_day('2020-02-30');
20. date_format(): 格式化日期
select date_format('2020-10-28 12:12:12','yyyy/MM/dd HH:mm:ss');
21. round: 四舍五入
select round(3.14);
select round(3.54);
22. ceil: 向上取整
select ceil(3.14);
select ceil(3.54);
floor: 向下取整
23. select floor(3.14);
select floor(3.54);
24. upper: 转大写
select upper('low');
25. lower: 转小写
select lower('low');
26. length: 长度
select length("atguigu");
27. trim: 前后去空格
select trim(" atguigu ");
28. lpad: 向左补齐,到指定长度
select lpad('atguigu',9,'g');
29. rpad: 向右补齐,到指定长度
select rpad('atguigu',9,'g');
30. regexp_replace:使用正则表达式匹配目标字符串,匹配成功后替换!
SELECT regexp_replace('2020/10/25', '/', '-');
31. size: 集合中元素的个数
select size(friends) from test3;
32. map_keys: 返回map中的key
select map_keys(children) from test3;
33. map_values: 返回map中的value
select map_values(children) from test3;
34. array_contains: 判断array中是否包含某个元素
select array_contains(friends,'bingbing') from test3;
35. sort_array: 将array中的元素排序
select sort_array(friends) from test3;
自定义函数 - Hive官方文档
根据用户自定义函数类别分为以下三种:
(1)UDF(User-Defined-Function): 一进一出;
(2)UDAF(User-Defined Aggregation Function): 聚集函数,多进一出;
类似于:count/max/min
(3)UDTF(User-Defined Table-Generating Functions): 一进多出。
如 lateral view explode()
1、自定义UDF函数
<dependency>
<groupId>org.apache.hivegroupId>
<artifactId>hive-execartifactId>
<version>3.1.2version>
dependency>
/**
* 自定义UDF函数,需要继承GenericUDF类
* 需求: 计算指定字符串的长度
*/
public class HiveUDF extends GenericUDF {
/**
*
* @param objectInspectors 输入参数类型的鉴别器对象
* @return 返回值类型的鉴别器对象
* @throws UDFArgumentException
*/
@Override
public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
// 判断输入参数的个数
if(objectInspectors.length != 1){
throw new UDFArgumentLengthException("输入参数长度错误!!!");
}
// 判断输入参数的类型
if(!objectInspectors[0].getCategory().equals(ObjectInspector.Category.PRIMITIVE)){
throw new UDFArgumentTypeException(0, "输入参数类型错误!!!");
}
//函数本身返回值为int,需要返回int类型的鉴别器对象
return PrimitiveObjectInspectorFactory.javaIntObjectInspector;
}
/**
* 函数的逻辑处理
* @param deferredObjects 输入的参数
* @return 返回值
* @throws HiveException
*/
@Override
public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
if(deferredObjects[0].get() == null){
return 0 ;
}
return deferredObjects[0].get().toString().length();
}
@Override
public String getDisplayString(String[] strings) {
return "计算指定字符串的长度";
}
}
1、将项目打成jar包上传到服务器/local/datas/myudf.jar
2、将jar包添加到hive的classpath
hive (default)> add jar /local/datas/myudf.jar;
3、创建临时函数与开发好的java class关联
hive (default)> create temporary function myudf as "com.atguigu.hive.MyStringLength";
4、即可在hql中使用自定义的函数
hive (default)> select myudf(name) as name_len from emp;
2、自定义UDTF
public class MyUDTF extends GenericUDTF {
private ArrayList<String> outList = new ArrayList<>();
@Override
public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {
//1.定义输出数据的列名和类型
List<String> fieldNames = new ArrayList<>();
List<ObjectInspector> fieldOIs = new ArrayList<>();
//2.添加输出数据的列名和类型
fieldNames.add("lineToWord");
fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
}
@Override
public void process(Object[] args) throws HiveException {
//1.获取原始数据
String arg = args[0].toString();
//2.获取数据传入的第二个参数,此处为分隔符
String splitKey = args[1].toString();
//3.将原始数据按照传入的分隔符进行切分
String[] fields = arg.split(splitKey);
//4.遍历切分后的结果,并写出
for (String field : fields) {
//集合为复用的,首先清空集合
outList.clear();
//将每一个单词添加至集合
outList.add(field);
//将集合内容写出
forward(outList);
}
}
@Override
public void close() throws HiveException {}
}