Hive的数据类型

image.png

image.png

image.png

image.png

image.png
- array_type 数组类型
- map_type map键值对类型
- struct_type 类似于C语言的结构体和java中的类
创建表
内部表
create table psn(
id int,
name String,
likes array<String>,
address map<string,string>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n'
加载数据到表中
LOAD DATA LOCAL INPATH '/root/user/data.txt' INTO TABLE table_name;
外部表
create EXTERNAL table psn(
id int,
name String,
likes array<String>,
address map<string,string>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n'
localtion '/usr/';
Hive分区 partition
分区字段不能在表的列中
create EXTERNAL table psn(
id int,
name String,
likes array<String>,
address map<string,string>
)
partition by (age int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n'
localtion '/usr/';
Hive JDBC
Hive JDBC运行方式 ,服务端需要启动hiveserver2后,在java代码中通过调用hive的jdbc访问默认端口10000进行连接、访问
Hive 函数
1.自定义函数
自定义函数包括三种 UDF,UDAF,UDTF
- UDF(User-Defined-Function)一进一出
- UDAF(User-Defined Aggregation Function)聚合函数,多进一出。Count/max/min
- UDTF(User-Defined Table-Generating Function)一进多出,如lateral view explore()
使用方式:在hive回话中add自定义函数的jar文件,然后创建function继而使用函数
2.关系运算符
- a = b
- a > b
- a IS NULL
- a IS NOT NULL
- a LIKE b // 模糊匹配
- a RLIKE b
- a REGEXP b
- ...
3.算数运算符
- a + b
- a - b
- a / b
- a % b
- a & b // 按位 “与”
- a | b // 按位 “或”
- a ^ b // 按位 “异或”
- ~a // 对一个表达式执行按位 “非”(取反)
4.逻辑运算符
- a AND b
- a && b
- a OR b
- a | b
- NOT b
- !A
5.复杂类型函数
- map —— (key1,value1,key2,value2)—— 通过指定的键值对,创建一个map
- struct —— (val1, val2, val3, ...) —— 通过指定的字段值,创建一个结构。结构字段名称将COL1, COL2, ...
- array —— (val1, val2, ...) —— 通过指定的元素,创建一个数组
对复杂类型函数操作
- A[n] —— A是一个数组,n为int型 —— 返回数组A的第n个元素,第一个元素的索引为0
- M[key] —— M是Map<K,V> —— 返回key对应的值
- S.x —— S是struct —— 返回结构x字符串在结构S中的存储位置
6.内置函数
| 返回类型 | 函数 | 说明 |
|---|---|---|
| BIGINT | round(double a) | 四舍五入 |
| DOUBLE | round(double a, int d) | 小数部分d位之后数字四舍五入,列如round(20.263, 2) 返回21.26 |
| BIGINT | floor(double a) | 对给定数据进行向下舍入最接近的整数例如 floor(21.2),返回21 |
| BIGINT | ceil(double a), ceiling(double a) 将参数向上舍入为最接近的整数。列如ceil(21.2) 返回22 | |
| double | rand(), rand(int seed) | 返回大于或等于0且小于的平均分布随机数(依重新计算而变) |
| double | exp(double a) | 返回e的n次方 |
| double | ln(double a) | 返回给定数值的自然对数 |
| double | log10(double a) | 返回给定数值的以10为底自然对数 |
| double | log2(double a) | 返回给定数值的以2为底自然对数 |
| double | log(double base, double a) | 返回给定底数以及指数返回自然对数 |
| double | pow(double a, double p) power(double a, double p) | 返回某数的乘幂 |
| double | sqrt(double a) | 返回某数值的平方根 |
| string | bin(BIGINT) | 返回二进制格式 |
| string | hex(BIGINT a) hex(string a) | 将整数或者字符转换为十六进制格式 |
| string | unhex(string a) | 十六进制字符转换由数字表示的字符 |
| string | conv(BIGINT num, int from_base, int to_base) | 将指定数值,由原来的度量体系转换为指定的试题体系,如conv('a', 16,2) 返回‘1010’ |
| double | abs(double a) | 取绝对值 |
| int,double | pmod(int a, int b) pmod(double a, double b) | 返回a除b的余数的绝对值 |
| double | sin(double a) | 返回给定角度的正弦值 |
| double | asin(double a) | 返回x的反正弦,即是X。如果X是在-1到1的正弦值,返回NULL |
| double | cos(double a) | 返回余弦 |
| double | acos(double a) | 返回X的反余弦,即余弦是X,如果 -1<= A < =1,否则返回null |
| int, double | postive(double int a) positive(double a) | 返回A的值,例如positive(2)返回2 |
| int, double | negative(double int a) negative(double a) | 返回A的值,例如positive(2)返回-2 |
7.收集函数
| 返回类型 | 函数 | 说明 |
|---|---|---|
| int | size(Map<K,V>) | 返回元素的数量 |
| int | size(Array<T>) | 返回元素的数量 |
8.类型转换函数
| 返回类型 | 函数 | 说明 |
|---|---|---|
| 指定“type” | cast(expr as <type>) | 类型转换,例如将字符“1”,转换为整数: cast('1', as bitint) ,如果转换失败返回null |
| int | size(Array<T>) | 返回元素的数量 |
9.日期函数
| 返回类型 | 函数 | 说明 |
|---|---|---|
| string | from_unixtime(bigint unixtime[, string format]) | UNIX_TIMESTAMP参数表示返回一个值‘YYYY-MM-DD HH:MM:SS’或‘YYYYMMDDHHMMMSS.uuuuuu’格式,这取决于是否在一个字符串或数字语境中使用的功能。该值表示在当前的时区。 |
| bigint | unix_timestamp() | 如果不带参数的调用,返回一个Unix时间戳 |
| bigint | unix_timestamp(string date) | 指定日期函数调用UNIX_TIMESTAMP(),它返回指定值的时间戳 |
| bigint | unix_timestamp(string date, string pattern) | 指定时间输入格式,返回到1970年秒数 |
| string | to_date(string timestamp) | 返回时间中的年月日 |
| string | to_dates(string date) | 给定一个日期date,返回一个天数,0年以来的天数 |
| int | year(string date) | 返回指定时间的年份,范围在1000到9999 |
| int | month(string date) | 返回指定时间的月份,范围1-12,(或者0,一个月的一部分,如0000-00-00,或2008-00-00的日期) |
| int | day (string date) dayofmonth(date) | 返回指定时间的日期值 |
| int | hour(string date) | 返回指定时间的小时,范围0到23 |
| int | minute(string date) | 返回指定时间的分钟,范围0到59 |
| int | minute(string date) | 返回指定时间的秒,范围0到59 |
| int | weekofyear(string date) | 返回指定日期所在一年中的星期号,范围0-53 |
| int | datediff(string enddate, string startdate) | 两个时间参数的日期之差 |
| int | date_add(string startdate, int days) | 给定时间,在此基础上加上指定的时间段 |
| int | date_sub(string startdate, int days) | 给定时间,在此基础上减去指定的时间段 |
10.条件函数
| 返回类型 | 函数 | 说明 |
|---|---|---|
| T | if(boolean testCondition, T valueTrue, T valueFalseOrNull) | 判断条件是否满足,如果满足返回第一个值,否则返回另外一个 |
| T | COALESCE(T v1, T v2, ...) | 返回一组数据中第一个不为NULL的值,如果均为NULL,返回NULL |
| T | CASE a WHNE b THEN c [WHEN d THEN e] * [ELSE f] END | 当a=b时,返回c;当a=d时,返回e,否则返回f |
| T | CASE WHEN a THEN b [WHEN c THEN d] * [ELSE e] END | 当值为a时返回b,当值为c时返回d。否则返回e |
11.字符函数
| 返回类型 | 函数 | 说明 |
|---|---|---|
| int | length(string A) | 获取字符串长度 |
| string | reverse(string A) | 返回倒序字符串 |
| string | concat(string A, string B ...) | 连接多个字符串,合并为一个字符串,可以接受任意数量的输入字符串 |
| string | concat_ws(string SEP, string A, string B ...) | 连接多个字符串,字符串之间以指定的分隔符分开 |
| string | substr(string A, string start) substring(string A, string start) | 从文本字符串中指定的起始位置后的字符 |
| string | substr(string A, int start, int len) substring(string A, int start, int len) | 从文本字符串中指定的位置指定长度的字符 |
| string | upper(string A) ucase(string A) | 文本转大写 |
| string | lower(string A) lcase(string A) | 文本转小写 |
| string | trim(string A) ltrim(string A) rtrim(string A) | 删除空格、左边空格、右边空格 |
| string | regexp_replace(string A, string B, string C) | 字符串A中的B字符被C字符替代 |
| string | regexp_extract(string subject, string pattern, string index) | 通过下标返回正则表达式指定的部分。regexp_extract('foothebar', 'foo(.*?)', 2) returns 'bar.' |
| string | repeat(string str, int n) | 重复N此字符串 |
| string | ...... |
12.内部聚合函数
| 返回类型 | 函数 | 说明 |
|---|---|---|
| bigint | count(*) | 统计记录行数 |
| double | sum(col) | - |
| double | avg(col) | - |
| double | min(col), | - |
| double | max(col) | - |
| double | var_pop(col) | 指定列的方差 |
| double | var_samp(col) | 返回指定列的样本方差 |
| double | stddev_pop(col) | 返回指定列的偏差 |
| double | stddev_samp(col) | 返回指定列的样本偏差 |
| double | covar_pop(col1, col2) | 两列数值协方差 |
| double | covar_samp(col1, col2) | 两列数值样本协方差 |
| double | corr(col1, col2) | 返回两列数值的相关系数 |
内置表生成函数(UDTF)(*****)
| 返回类型 | 函数 | 说明 |
|---|---|---|
| 数组 | explode(array<TYPE> a) | 数组一条记录中有多个参数,将参数拆分,每个参数生成一列 |
| - | json_tuple | - |
自定义函数实践
UDF开发
- UDF函数可以直接应用于select语句,对查询结构做格式化处理后,再输出内容。
2.编写UDF函数的时候需要注意以下几点:
a)自定义UDF需要继承 org.apache.hadoop.hive.ql.UDF
b)需要实现evaluate函数,evaluate函数支持重载
3.步骤
a) 把程序打包放到目标机器上去
b) 进入hive客户端,添加jar包: hive > add jar /run/jar/udf_test.jar;
c)创建临时函数: hive > CREATE TEMPORARY FUNCTION fun_name AS 'com.xx.xx.TuoMin' ;
d) 使用自定义的函数: 如: select fun_name(username) from table_name;
实战 - 脱敏
import org.apache.hadoop.hive.ql.exec.UDF;
public class TuoMin extends UDF {
public Text evaluate(final Text s ) {
if(s == null) {
return null;
}
String str = s.toString().substring(0,3) + "***"; // 例子
return new Text(str);
}
}
Hive总结
- hive是数据仓库,主要用来对历史数据做分析
- hive的产生是为了帮助非java程序员做MR分析
- hive是以hdfs为基础的,所有数据存储在hdfs上,hdfs所有操作都是hdfs和MR操作
- hive的搭建。(1)本地模式 (2)单用户模式 :将mysql与hive分割在不同的服务器上,通过远程访问 (3)多用户