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<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开发

  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)多用户
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • hive简介 解释一:Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据。它架构在Hadoop之上,...
    卡卡xx阅读 6,282评论 0 4
  • 官方参考文档 LanguageManual DDL 创建/删除/更改/使用数据库 在hive sql中databa...
    井地儿阅读 1,160评论 0 1
  • Hive基础语法 1、创建表 – 用户表 CREATE[EXTERNAL外部表]TABLE[IF NOT EXIS...
    辉格食品阅读 2,098评论 0 3
  • Hive的作用 使用Hive QL (语法类似于SQL)做一些MapReducer能做的事情,但是他并不完全支持S...
    末央酒阅读 478评论 0 0
  • Hive的数据类型 Hive支持基本数据类型和复杂数据类型。基本数据类型包括数值型,布尔型,字符串型和时间戳类型。...
    井地儿阅读 361评论 0 1