Hive:由Facebook开源用于解决海量结构化日志的数据统计
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能
本质:将HQL转换为MapReduce程序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sg9OKVLZ-1572950635997)(pictrue/1570624895386.png)]
Hive的HQL表达能力有限
Hive的效率比较低
1.3 Hive 架构原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-euUTL6c6-1572950635998)(pictrue/1570625600517.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-onyiE0gL-1572950635998)(pictrue/1570625709484.png)]
[root@slave01 ~]# hive --help
Usage ./hive --service serviceName
Service List: beeline cli help hiveburninclient hiveserver2 hiveserver hwi jar lineage metastore metatool orcfiledump rcfilecat schemaTool version
Parameters parsed:
--auxpath : Auxillary jars
--config : Hive configuration directory
--service : Starts specific service/component. cli is default
Parameters used:
HADOOP_HOME or HADOOP_PREFIX : Hadoop install directory
HIVE_OPT : Hive options
For help on a particular service:
./hive --service serviceName --help
Debug help: ./hive --debug --help
[root@slave01 ~]# hive -e "show databases;"
Logging initialized using configuration in jar:file:/opt/Hive1.1/apache-hive-1.1.0-bin/lib/hive-common-1.1.0.jar!/hive-log4j.properties
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/Hadoop2.6/hadoop-2.6.0/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/Hive1.1/apache-hive-1.1.0-bin/lib/hive-jdbc-1.1.0-standalone.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
OK
default
Time taken: 0.603 seconds, Fetched: 1 row(s)
[root@slave01 ~]# cat hive.sql
show databases;
[root@slave01 ~]# hive -f hive.sql
Logging initialized using configuration in jar:file:/opt/Hive1.1/apache-hive-1.1.0-bin/lib/hive-common-1.1.0.jar!/hive-log4j.properties
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/Hadoop2.6/hadoop-2.6.0/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/Hive1.1/apache-hive-1.1.0-bin/lib/hive-jdbc-1.1.0-standalone.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
OK
default
Time taken: 0.542 seconds, Fetched: 1 row(s)
在hive cli命令窗口如何查看hdfs文件系统
hive (default)> dfs -ls /;
Found 10 items
drwxrwxrwx - root supergroup 0 2019-10-08 08:13 /file3_1
drwxrwxrwx - root supergroup 0 2019-10-08 14:27 /hbase
在Hive cli命令窗口如何查看本地文件系统
hive (default)> ! ls /opt;
Hadoop2.6
Hbase1.2
Hive1.1
查看hive中输入的的所有历史命令
进入到当前用户的根目录/root或/home/>>>
查看.hivehistory文件
[root@slave01 ~]# cat .hivehistory
Hive数据类型 | java 数据类型 | 长度 | 例子 |
---|---|---|---|
tinyint | byte | 1byte有符号整数 | 20 |
smaliint | 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 | 字符串系列 | “hello word" |
timestamp | 时间类型 | ||
binany | 字节数据 |
对于Hive的string类型相当于数据库的Varchar类型,该类型是一个可变的字符串,不过他不能声明其中最多能存储多少个字符,理论上2GB
数据类型 | 描述 | 语法示例 |
---|---|---|
STRUCT | 和c语言中的struct类似,都可以通过”点“符号访问元素内容,如果某个列的数据类型是struct(first string,last string),那么第一个元素可以通过字段.first来引用 | struct() |
Map | Map是一组建-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数数据类型是Map,其中键->值对是”first"->“join"和”last"->“doe”,那么可以通过字段名[‘last’]获取最后一个元素 | map() |
ARRAy() | 数组是组具有相同类型和名称的变量的集合,这些变量称为数组的元素,每个数组元素都有一个编号,编号从0开始 | Array() |
Hive有三种复杂数据类型ARRAY、Map、和STRUCT。Array和Map与Java中的Array和map类似,而STRUCT与c语言中的Struct类似,他封装了一个命名字段集合
实例:
/*数据格式:
{
"name":"songsong",
"friends":["binging,"lisi"],
"children:{
"xiaotian":18,
"susu":19
}
"address":{
"street":"hui long guan",
"city":"beijing"
}
}
// 基于上述数据结构,我们在Hive中创键对应的表,并导入数据
hive (default)> create database test;
OK
Time taken: 0.633 seconds
hive (default)> show databases;
OK
default
test
Time taken: 0.104 seconds, Fetched: 2 row(s)
hive (default)> create table test.Onetest (
> name string,
> friends array,
> children map,
> address struct)
> row format delimited fields terminated by ',' --列分隔符
> collection items terminated by '_' -- Map struct 和array的分隔符(数据分隔符)
> map keys terminated by ':' --Map中的key与Value的分隔符
> lines terminated by '\n';
OK
Time taken: 0.32 seconds
//创键数据文件hive.json
[root@slave01 ~]# cat Hive.json
songsong,bingbing_lili,xiao songlong guan_beijing
sgsong,bingbing_lili,xiao song:1ng guan_beijing
ongsong,bingbing_lili,xiao song:ong guan_beijing
//导入文件数据到测试表
hive (default)> use test;
OK
Time taken: 0.012 seconds
hive (test)> load data local inpath "/root/Hive.json" into table Onetest;
Loading data to table test.onetest
Table test.onetest stats: [numFiles=1, totalSize=162]
OK
Time taken: 1.162 seconds
//查看数据
[root@slave01 ~]# hive -e "select * from test.onetest;"
Logging initialized using configuration in jar:file:/opt/Hive1.1/apache-hive-1.1.0-bin/lib/hive-common-1.1.0.jar!/hive-log4j.properties
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/Hadoop2.6/hadoop-2.6.0/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/Hive1.1/apache-hive-1.1.0-bin/lib/hive-jdbc-1.1.0-standalone.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
OK
songsong ["bingbing","lili"] {"xiao song":18,"xiaoxiao song":19} {"street":"hui long guan","city":"beijing"}
sgsong ["bingbing","lili"] {"xiao song":18,"xiaoxiao song":19} {"street":"hui long guan","city":"beijing"}
ongsong ["bingbing","lili"] {"xiao song":18,"xiaoxiao song":19} {"street":"hui long guan","city":"beijing"}
hive> select friends from test.onetest;
OK
["bingbing","lili"]
["bingbing","lili"]
["bingbing","lili"]
hive (test)> select friends[0] from onetest;
OK
bingbing
bingbing
bingbing
Time taken: 0.247 seconds, Fetched: 7 row(s)
hive (test)> select friends[1] from onetest;
OK
lili
lili
lili
hive (test)> select children from onetest;
OK
{"xiao song":18,"xiaoxiao song":19}
{"xiao song":18,"xiaoxiao song":19}
{"xiao song":18,"xiaoxiao song":19}
hive (test)> select children["xiao song"] from onetest;
OK
18
18
18
hive (test)> select addresses.street from onetest;
OK
hui long guan
hui long guan
hui long guan
Hive的原子数据类型可以进行隐式转换的,类似于Java的类型转换,例如某表达式使用INT类型,tinyint会自动转换为Int类型,但是Hive不会经行反向转换,例如某表达式使用tinyint类型,int不会自动转换tinyint类型,它会返回错误,除非使用cast操作
例如casst(“1” as int) 将字符串"1"转换成整数1,如果强制类型转换失败,如执行
cast("X"as int) ,表达式返回空值Null
(1)、如果将浮点型的数据转换成int类型的,内部操作是通过round()或者floor()函数来实现的,而不是通过cast实现!
(2)、对于BINARY类型的数据,只能将BINARY类型的数据转换成STRING类型。如果你确信BINARY类型数据是一个数字类型(a number),这时候你可以利用嵌套的cast操作,比如a是一个BINARY,且它是一个数字类型,那么你可以用下面的查询:
SELECT (cast(cast(a as string) asdouble)) from src;
我们也可以将一个String类型的数据转换成BINARY类型。
(3)、对于Date类型的数据,只能在Date、Timestamp以及String之间进行转换。下表将进行详细的说明:
create database [if not exists] database_name location 'dataresource_path'
comment "描述信息"
参数说明:
if not exists:避免创键同名数据库而抛出错误
location:修改数据库源文件默认位置
comment:为这个数据库增加描述信息
其他操作说明
1.使用某个数据库
use database_name;
2. 显示当前数据库下的所有表
show tables;
3. 显示当前使用数据
set hive.cli.print.current.db=true
3. 删除数据库 (if exists 避免数据库不存在而抛出错误)
drop database if exists databases_name
create [external] table [if not exists] table_name
[(col_name data_type [comment col_comment],...)]
[comment table_comment]
[partitioned by (col_name dta_type[comment col_comment],...)]
[clustered by (col_name,col_name,...)]
[sorted by (col_name[Asc|desc],...)] into num_buckets buckets]
字段解释说明:
create table: 创键一个指定名称的表,
if not exists:避免创键同名数据表而抛出错误
external: 关键字可以让用户创键一个外部表,在建表的同时指定一个指向实际数据的路径(path),Hive创键内部 表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何 改变,在删除表的时候,内部表的元数据会被一起删除,而外部只删除元数据的路径,不删除源数据
comment:为表和字段添加注释说明
partitioned by :创键分区表
clustered by :创键分桶表
sorted by :不常用
row format delimited [fields terminted by char] [collection items terminated by char] [map keys terminated by char] [lines terminated by char] | sered serde_name[with serdeproperties(property_name=property_value,property_name=property_value,...)]
参数说明:
用户在建表的时候可以自定义serde或者使用自带的serde。如果没有指定row format 或者row format delimited ,将会使用自带的serde,在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会将自定义的serde,Hive通过serde确定表的具体的列的数据
Serde 是Serialize/Deserilize的简称,目的是用于序列化和反序列化
stored as:指定存储文件类型,Hive本身支持的文件格式只有:Text File,Sequence File。如果文件数据是纯文本,可以使用 [STORED AS TEXTFILE]。如果数据需要压缩,使用 [STORED AS SEQUENCE]
location:指定表在hdfs上的存储位置
like:允许用户复制现在的表结构,但不复制数据
fields terminated by "分隔符":指定hdfs每个字段的分割符
lines terminated by "分割符":指定hdfs行数据行分割符,默认”/n"
collection items terminated by cahr:指定Map、Struct、Array的分隔符
map keys terminated by char:指定ma和key之间的分隔符
1. 显示数据库详细信息
desc database db_name;
2. 切换数据库
use db_naem;
3. 显示所有数据库
show databases;
4. 显示当前数据库的所有表
show tables;
5. 指定数据库,显示所有表
show tables in db_name;
6.查看表的详细信息 (fromatted 代替entend可以提供更加可读的和冗长的传输信息)
describe extended db_name.tb_name;
用户可以使用alter database 命令为某个数据库的dbproperties设置键-值对属性值,来描述这个数据库的属性信息,数据库的其他元数据信息都是不可变的
alter database database_name set dbproperties ('edited-by'='joe dba')
修改字段的数据类型
Alter table tb_name change column old_clo_name new_clo_name data_typer
表重命名
alter tb tb_name rename to new_db_name.5
修改列信息
alter table tb_name change column old_column_name new_column_name data_type comment after column_name;
参数说明:
column:字段名
data_typ:数据类型
comment:注释说明
after column_name:指定某个字段的后面,可用first将该字段移动到第一个位置
增加列
alter table tb_name add columns(column_name1 type,.....)
drop db if exists db_name cascade;
参数说明:
if exists:避免数据库不存在而报错
cascade:数据库不为空则需要使用该参数。进行强制删除
drop tb if exists db_name;
参数说明:
if exists:避免数据表不存在而报错
语法:
load data [local] inpath “filepath" [overwrite] into table tablename [partition (partcol1=val1,partcol2=val2 ...)]
tblproperties("skip.header.line.count"="1");
参数说明:
local:指的是本地操作系统的文件路径,否则默认为HDFS的文件路径;
tblproperties("skip.header.line.count"="1"):忽略首行;
overwrite:覆盖
1. 单个查询语句中创键表并加载数据
create table table_name sql 语句
2. 通过查询语句向表中插入数据
先建表
insert [overwrite|into] table table_name [parttion(partcol1=val1....)] sql语句
overwrite:覆盖
into:追加
1. 直接**cp** 源文件
hdfs dfs -cp source_path target_path
2. 使用insert...directory
insert overwrite local directory "local_path" sql语句
local:设置位本地路径,如果不设置默认为Hdfs文件地址
分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件,Hive中的分区就是分目录,把一个大的数据集根据业务需求分割成小的数据集,在查询时通过where子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多
查看系统自带的函数
hive> show functions;
显示自带函数的用法
hive> desc function =;
OK
a = b - Returns TRUE if a equals b and false otherwise
Time taken: 0.047 seconds, Fetched: 1 row(s)
详细显示自带的函数用法
hive> desc function extended max;
OK
max(expr) - Returns the maximum value of expr
Time taken: 0.385 seconds, Fetched: 1 row(s)
编程步骤
继承org.apache.hadoop.hive.UDF
需要实现evaluate函数;evaluate函数支持重载
在hive的命令行窗口创键函数
添加jar
add jar linux_jar_path
创键function
create [temporary] function [dbname.]function_name AS class_name;
在hive的命令行窗口删除函数
Drop [temporary] function [if exists] [dbname.]function_name;
SELECT COL1* from table_name
SELECT SUM(COL_NAME) FROM TB_NAME;
运算符 | 类型 | 描述 |
---|---|---|
A + B | 数值 | A 加 B |
A - B | 数值 | A 减 B |
A * B | 数值 | A 乘 B |
A / B | 数值 | A 除以 B,返回商 |
A % B | 数值 | A 除以B的余数 |
A & B | 数值 | 与 |
A | B | 数值 | 或 |
A ^ B | 数值 | 异或 |
~A | 数值 | 取反 |
数学函数,用于处理单个列的(常用)
返回值类型 | 样式 | 描述 |
---|---|---|
BIGINT | round(DOUBLE D) | 返回Double型d的bigint类型的近似值 |
BOUBLE | round(DOUBLE d,INT n) | 返回Double型d的保留n位小数的double近似值 |
BIGINT | floor(DOUBLE d) | d是DOUBLE类型的,返回<=d的最大BIGINT型值 |
BIGINT | ceil(DOUBLE d) ceiling(DOUBLE d) | d是DOUBLE类型,返回>=d的最小BIGINT型值 |
DOUBLE | rand() rand(INT seed) | 每行返回一个DOUBLE型随机数,整数seed是随机因子 |
DUOBLE | exp(DOUBLE d) | 返回e的d幂次方,返回的是个DOUBLE型值 |
DOUBLE | sqrt(DOUBLE d) | 计算d的平方根 |
DOUBLE | abs(DOUBLE d) | 计算Double 型的d的绝对值 |
DOUBLE | pi() | 数学常数pi,也就是圆周率 |
聚合函数 对多行进行计算,然后得到一个结果值,即用户自定义函数
返回值类型 | 样式 | 描述 |
---|---|---|
BIGINT | count(*) | 计算总行数,包括null值的行 |
BIFGINT | count(expr) | 计算提供的expr表达式的值非null的行数 |
BIGINT | count(DISTINCT expr[,expr_.]) | 计算提供的expr表达式的值排重后的非null的行数 |
DOUBLE | sum(col) | 计算指定行的值的和 |
DOUBLE | sum(DISTINCT col) | 计算排重后值的和 |
DOUBLE | avg(col) | 计算指定行的值的平均值 |
DOUBLE | avg(DISTINCT col) | 计算排重后值的平均值 |
DOUBLE | min(col) | 计算指定行的最小值 |
DOUBLE | max(col) | 计算指定行的最大值 |
DOUBLE | variance(col),var_pop(col) | 返回集合col中的一组数值的方差 |
DOUBLE | var_samp(col) | 返回集合col中的一组数值的样本方差 |
DOUBLE | stddev_pop(col) | 返回一组数值的标准偏差(标准差) |
DOUBLE | stddev_samp(col0 | 返回一组数值的样本标准偏差 |
DOUBLE | covar_pop(col1,col2) | 返回一组数值的协方差 |
DOUBLE | covar_samp(col1.col2) | 返回一组数值的样本协方差 |
DOUBLE | corr(col1,col2) | 返回两组数值的相关系数 |
DOUBLE | percentile(BIGINT int_expr,p) | int_expr在P([o,1]处所对应的百分比),p是一个Double型数值 |
ARRAY | percentile(BIGINT int_expr,Array(p1[,p2]…)) | int_expr在P([o,1]处所对应的百分比),p是一个Double型数组 |
DOUBLE | percentile_approx(DOUBLE col ,p[,NB] ) | col 在P([o,1]处所对应的百分比),p是一个Double型数值,NB是用于估计的直方图中的仓库数量(默认1000) |
STRING | upper(STRING A) ucase(STRING A) | 将字符串中的字母转换成大写字母 |
STRING | from_unixtime(BIGINT unixtime[,String fromat]) | 将时间戳秒数转换成UTC时间,并用字符串表示,可以通过format规定的时间格式,指定输出的时间格式 |
BIGINT | unix_timestamp() | 获取当前本地时区下的当前时间戳 |
BIGINT | unix_timestamp(String date) | 输入的时间字符串格式必须是yyyy-MM-dd HH:mm:ss 如果不符合则返回0,如果符合则返回Unix的时间戳 |
BIGINT | unix_timestamp(STRING date,STRING pattern) | 将指定时间字符串格式字符串转换成Unix时间戳,如果格式不对则返回0 |
STRING | to_date(STRING timestamp) | 返回时间字符串的日期部分 |
INT | year(STRING data | 返回时间字符串的年份并使用int类型 |
INT | datadiff(STRING enddate,STRING startdate) | 计算开始时间到结束时间相差的天数 |
STRING | date_add(STRING startdate,INt days) | 为开始时间增加N天 |
STRING | date_sub(STRING startdate,INt days) | 为开始时间减少天 |
查询返回指定行数
select * from tb_name limit n
例子:
select name,salary,
case
when salary < 5 then 1
when salary >=5 and salary < 8 then 2
else 3
and as ab
from tb_name
SELECT 语句用于选取字段,WHERE语句用于过滤条件
操作符 | 支持数据类型 | 描述 |
---|---|---|
a = b | 基本数据类型 | 如果a等于b则返回true,否则就返回false |
a<=>b | 基本数据类型 | 如果a和b都为null,则返回True,其他的和等号(=)操作符的结果一致,如果任意为null,则结果为null |
a<>b,a!=b | 基本数据类型 | a或b为null 则返回null ;如果a不等于b则返回true,反之则为false, |
rlike后面的字符串表达式含义:
(.):表示和任意的字符匹配
(*):表示重复左边的字符串
9|):或
group by 语句:通常会和聚合函数一起使用,按照一个或者多个列对结果进行分组,然后对每个组执行操作
having 子句允许用户通过一个简单的语法完成原本需要通过子查询才能对group by语句产生的分组进行条件过滤的任务
内连接中(INNER JOIN)中,只有进行连接的两个表中都存在与连接标准相匹配的数数据才会保留下来
例:
select tb1.col1,tb1.col2,tb2.col3
from tb1 join tb2 on tb1.col1 = tb2.col2p
左外连接通过关键字LEFT OUTER 进行标识
外连接
右外连接
完全外连接
sort by ,其只会在每个reducer中对数据进行排序,执行一个局部排序过程
order by ,对查询结果集做一个全局排序
默认asc 升序
desc 降序
select col1,col2 from tb where cast(col1 type) < ?
unionall 可以将2个或多个表进行合并,每一个union 子查询都必须具有相同的列,而且对应的每个字段类型都是一样的
G 语句
having 子句允许用户通过一个简单的语法完成原本需要通过子查询才能对group by语句产生的分组进行条件过滤的任务
内连接中(INNER JOIN)中,只有进行连接的两个表中都存在与连接标准相匹配的数数据才会保留下来
例:
select tb1.col1,tb1.col2,tb2.col3
from tb1 join tb2 on tb1.col1 = tb2.col2p
左外连接通过关键字LEFT OUTER 进行标识
外连接
右外连接
完全外连接
sort by ,其只会在每个reducer中对数据进行排序,执行一个局部排序过程
order by ,对查询结果集做一个全局排序
默认asc 升序
desc 降序
select col1,col2 from tb where cast(col1 type) < ?
unionall 可以将2个或多个表进行合并,每一个union 子查询都必须具有相同的列,而且对应的每个字段类型都是一样的