Hive的数据类型
- 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)多用户