Hive学习笔记

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,
    address map
)
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,
    address map
)
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,
    address map
)
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 —— 返回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) 返回元素的数量
int size(Array) 返回元素的数量

8.类型转换函数

返回类型 函数 说明
指定“type” cast(expr as ) 类型转换,例如将字符“1”,转换为整数: cast('1', as bitint) ,如果转换失败返回null
int size(Array) 返回元素的数量

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 a) 数组一条记录中有多个参数,将参数拆分,每个参数生成一列
- json_tuple -

自定义函数实践

UDF开发

  1. 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)多用户

你可能感兴趣的:(Hive学习笔记)