Hive知识点总结

写出hive建表的完整语句

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

[(col_name data_type [COMMENT col_comment], ...)]

[COMMENT table_comment]

[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]

[CLUSTERED BY (col_name, col_name, ...)

[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]

[ROW FORMAT row_format]

[STORED AS file_format]

[LOCATION hdfs_path]

[TBLPROPERTIES (property_name=property_value, ...)]

[AS select_statement]

1、hive的定义

hive是基于hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类sql查询功能。

2、hive的本质

本质是:将hql转化成mapreduce程序

3、hive的架构

   用户接口:client

CLI(command-line interface)、JDBC/ODBC(jdbc访问hive)、WEBUI(浏览器访问hive)

   元数据:metastore

元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;

   默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore

 hadoop

   使用hdfs进行存储,

   使用mapreduce进行计算。

   使用yarn进行资源调度

   驱动器:driver 解析器 编译器 优化器 执行器

4、hive的优缺点

 优点

1操作接口采用类sql语法,提供快速开发的能力(简单、容易上手)。

2避免了去写mapreduce,减少开发人员的学习成本。

3 hive的执行延迟比较高,因此hive常用于数据分析,对实时性要求不高的场合。(特性)

4 hive优势在于处理大数据,对于处理小数据没有优势,因为hive的执行延迟比较高。

5 hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

 缺点

1 hive的hql表达能力有限

(1)迭代式算法无法表达

(2)数据挖掘方面不擅长,由于mapreduce数据处理流程的限制,效率更高的算法却无法实现。

2 hive的效率比较低

(1)hive自动生成的mapreduce作业,通常情况下不够智能化

(2)hive调优比较困难,粒度较粗

5、hive和数据库比较

1 查询语言不同:hive采用的是类sql语言称为hql

2数据存储位置不同:hive是将数据存储在hdfs上,而数据库则是将数据存储在本地或者块设 备上

3数据更新:hive读多写少且不建议对数据进行修改

数据库则是需要经常对数据进行修改

4执行引擎:hive中大部分查询是通过mapreduce来实现,数据库是用自己的执行引擎

5执行延迟:因为hive没有索引所以查询数据时需要扫描整个表,因为mapreduce框架,所以 导致延迟高

数据库在处理数据量小的情况下执行延迟低。

6可扩展性:因为hive基于hadoop,所以hive的可扩展性与hadoop一样。

数据库由于acid语义的严格限制,可扩展性非常有限

7数据规模:hive建立在集群上,可以用mapreduce进行并行计算,所以支持大规模的数据

而数据库可以支持的数据规模较小

6、hive的库、表和数据在hdfs上的形式;

   库在hdfs上是以.db结尾的目录的形式存在

表在hdfs上是以库的子目录的形式存在

数据存在于表(内部表)的目录下,以文件的形式存在

7、hive默认数据库,hive表中数据默认分隔符

       元数据储存在derby数据库中。 hive默认数据库 为 default;

建表默认分隔符:

表字段分隔符:默认是八进制'\u001' ctrl + v  ctrl + a

集合元素分隔符: '\u002' ctrl + v  ctrl + b

map kv 分隔符 '\u003' ctrl + v  ctrl + c.

8、hive默认元数据存放位置,配置后元数据存放位置

   默认存储在自带的derby 数据库中,推荐使用mysql存储metastore

9、hive的三种访问方式

CLI(命令行访问hive)

JDBC/ODBC(jdbc访问hive)

WEBUI(浏览器访问hive

10、hive的几种交互命令

①hive -d  等价于  hive --define 进入hive时定义一个参数的值

②hive --database 进入hive时指定使用的数据库

③hive -e 不进入hive命令行执行一个hql语句

④hive -f 不进入hive命令行执行一个hql脚本

⑤hive --hiveconf 配置hive的参数

⑥hive --hivevar 相当于hive -d

⑦hive -i 初始化一个hql脚本(执行完一个hql脚本后进入hive命令行)

⑧hive -S 等价于 hive --silent 静音模式

⑨hive -v 等价于 hive --verbose 冗余模式,将执行的hql语句打印一遍

11、hive的三个级别参数配置方式

配置文件方式 <命令行参数方式 <参数声明方式

配置文件方式:

默认配置文件:hive-default.xml

  用户自定义配置文件:hive-site.xml

命令行参数方式

启动Hive时,可以在命令行添加--hiveconf param=value来设定参数。仅对本次hive启动有效

参数声明方式

  可以在HQL中使用SET关键字设定参数  仅对本次hive启动有效

12、hive的基本数据类型和集合数据类型有哪些

基本数据类型:tinyint  smallint    int  bigint  boolean  float double string timestamp

集合数据类型:struct   map   array

13、hive数据类型之间隐式转换规则,强制类型转换cast的用法

 (1)任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT。

(2)TINYINT、SMALLINT、INT都可以转换为FLOAT。

  (3)所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE。

  (4)BOOLEAN类型不可以转换为任何其它的类型。

强制类型转换cast的用法

可以使用cast操作显示进行数据类型转换 cast('1' as int),转换成整数1

执行cast('x' as int),表达式返回空值 null执行失败

14、库、表、数据的增删改查语法

创建库:create database 库名;

删除库:drop database 库名;

修改库:alter database 库名 set dbproperties('键'='值');

查看库:desc database 库名;

创建表:create table 表名;

删除表:drop table 表名;

修改表:alter table 表名 set tblproperties(‘EXTERNAL’=’true’改为外部表/'EXTERNAL'=’false’修改为内部表);

查看表:select * from 表名;  

插入数据:insert into table  表名 partition(分区位置) values(值1),(值2);

删除表中的数据:truncate table 表名;

追加覆盖数据:insert overwrite table 表名 partition(分区位置) select 列名1,列名2 from 表名 where 位置;

查询数据:select * from 表名;

15、数据库的哪些信息可以更改,哪些信息不可更改

用户可以使用alter database命令为某个数据库的dbproperties设置键-值对属性值,来描述这个数据库的属性信息。

数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。即 desc展示的数据是不可更改的.

16、如何删除非空库

drop database 库名 cascade;(卡死k他)

17、内部表和外部表的区别,以及互相转换的语法

内部表:表中的数据属于该表,删除表时,数据会一并删除

外部表:该表并非真正拥有表内的数据,表在删除时,只会删除元数据,表中的数据不会被删除

内部表转换为外部表:alter table t6 set tblproperties('EXTERNAL' = 'true');

外部表转换为内部表:alter table t5 set tblproperties('EXTERNAL' = 'false');

18、什么是静态分区,什么是动态分区。两种分区方式插入数据的语法,动静结合方式插入数据的语法

静态分区是插入时对分区字段指定值,动态分区是插入时对分区字段不指定值

静态

insert into table info1 partition(sex='male') select id,name,year from worktmp;

动态

insert into info2 partition(year) select id,name,sex,year from worktmp;

动静结合

insert into info3 partition(sex='male',year) select id,name,year from worktmp;

19、什么严格/非严格模式

  严格模式:所有的分区字段中,至少一个分区字段是静态分区

  非严格模式:当所有的分区字段都使用动态分区插入数据时,需要使用非严格模式

20、分区/分桶的意义

分区:在分区表中,使用where关键字过滤指定分区中的数据查询时,可以提高查询效率

分桶: 1方便抽样查询

2两个表join时,如果两个表都是基于连接字段进行了分桶,可以以桶为单位进行join,从而减少Join的次数

21、什么时候使用分区,什么时候使用分桶

1   分区表针对的是按目录细分数据,针对的是数据的存储路径

  分桶表针对是按文件进行细分数据 针对的是数据文件。

2分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理的分区。对于一张表或者分区,Hive 可以进一步组织成桶,也就是更为细粒度的数据范围划分。

22、分桶的规则是什么

hive的分桶采用对分桶字段的值进行哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中

23、动态分区+分桶,静态分区+分桶插入数据的语法

create table info5(

id int, name string, sex string

)

partitioned by(year string)

clustered by(id) into 4 buckets

row format delimited fields terminated by '\t';

insert into table info5 partition(year) select id,name,sex,year from worktmp;

create table info4(

id int, name string, year string

)

partitioned by (sex string)

clustered by(id) into 4 buckets

row format delimited fields terminated by '\t';

insert into table info4 partition(sex='male') select id,name,year from worktmp;

动态分区+分桶插入数据:

insert into table 动态分区表名 partition(分区字段名) select 列名1,列名2,列名3, 内置函数year(列名1) 分区字段名 from 临时表名;

静态分区+分桶插入数据:

insert into table 静态分区表名 partition(分区字段名='分区字段值') select 列名1, 列名2,列名3 from 临时表名 where 内置函数year(列名1) = '分区字段值';

24、创建分区表、分桶表的语法

创建分区表的语法:

create table parTb(name string,age int)

partitioned by(location string)

row format delimited fields terminated by '\t';

创建分桶表的语法:

create table buckTb(

id int,

name string

)

clustered by(id);

sorted by(name desc) into 4 buckets;

25、hive表数据导入的6种方式

导入:

1 load装载

load data [local] inpath '本地路径' [overwrite] into table 表名 [partition (分区字段名=分区字段值,…)];

2 insert into/overwrite方式 inset不支持插入部分字段

基本插入:

插入:insert into table 表名 values(列值1,列值2,列值3),(列值1,列值2,列值3);

覆盖:insert overwrite table 表名values(列值1,列值2,列值3);

基本模式插入(根据从另一张表的查询结果插入):

insert into table 表名1  select 列名1,列名2  from 表名2;

3多表/多分区联合插入:

从一个表中查询一部分数据放入另一个表/分区,查询另一部分数据放入另一个表/分区内

from 表名1

insert into 表名2

select 列名1,列名2  where 条件

insert into 表名3

select列名1,列名2  where 条件;

4根据查询结果建表并加载数据  as ... select 方式,创建表并添加数据

create table 表名1  as select 列名1,列名2  from 表名2;

5建表时,通过location关键字指定数据在hdfs上的路径(目录)

create table表名(列名1 列类型,列名2 列类型,列名3 列类型) location 'hdfs上的路径';

6使用import命令,将export导出的结果导入到表中(要求表是空表)

import table 表名 from 'hdfs上export导出的结果目录';

26、hive表数据导出的4种方式

1 Insert导出:

insert overwrite  [local] directory '本地/hdfs路径' [row format delimited fields terminated by ','] select * from info;

 2 hadoop命令 hadoop fs -get 导出到本地

dfs -get /hive/importtable/sex=female/000000_0 /opt/module/datas/123/my.txt

等价于 hadoop fs -get /hive/importtable/sex=female/000000_0 /opt/module/datas/123/my.txt

3 hive的shell命令 hive -f/-e 执行语句或者脚本 >file

hive -e 'select * from info;' > /opt/module/datas/my2.txt

4 export 导出到hdfs上

export table 表名 to '本地路径'

①insert overwrite方式

② hadoop fs -get下载表中的数据文件

③ hive的交互命令查询结果追加/覆盖到本地文件

④ export导出到hdfs

27、hive语句执行的顺序

hive语句的执行顺序:

(1)from

(2)on

(3)join

(4)where

(5)group by

(6)having

(7)select

(8)distinct(迪斯定柯特)

(9)distribute by /cluster by(迪斯追毕又特百)

(10)sort by

(11) order by

(12) limit

(13) union /union all(油n嗯)

28、having和where的用法区别

having与where不同点

(1)where后面不能写聚合函数,而having后面可以使用聚合函数。

(2)having只用于group by分组统计语句。

29、哪些情况下join会产生笛卡尔积

(1)省略连接条件

(2)连接条件无效

(3)所有表中的所有行互相连接

30、order  by和sort  by 的区别

order by 会对数据进行全局排序,它只在一个reduce中进行所以数据量特别大的时候效率非常低。 ,

sort by 是单独在各自的reduce中进行排序,所以并不能保证全局有序,一般和distribute by

一起执行,而且distribute by 要写在sort by前面。

31、distribute by的作用

控制map 中的输出在 reducer 中是如何进行划分的。使用distribute by 可以保证相同key的记录被划分到一个reduce 中。

32、cluster by 的作用

cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是倒叙排序,不能指定排序规则为asc或者desc。

33、join、left join、right join、full join的区别

内连接:只保留能匹配上的数据

左连接,保留左表(写在join左边的表)的所有数据,右表进行匹配,匹配不上的用null填充

右连接,保留右表(写在join右边的表)的所有数据,左表进行匹配,匹配不上的用null填充

满外连接,保留两个表的所有数据,其中一个表匹配不上的都用null填充

34、增加单个分区、增加多个分区语法

alter table 表名 add partition(month='201706') ;

alter table 表名 add partition(month='201705') partition(month='201704');

35、删除单个分区、删除多个分区语法

alter table 表名 drop partition (month='201704');

alter table 表名 drop partition (month='201705'), partition (month='201706');

36、列的更新、增加和替换语法

更新列

alter table table_name change [column] col_old_name col_new_name

column_type [comment col_comment] [first|after column_name]

增加和替换列

alter table table_name add|replace columns (col_name data_type [comment col_comment], ...)

add 是代表新增一字段,字段位置在所有列后面(partition 列前),replace 则是表示替换表中所有字段。

37、行列转换语法

行转列

CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;

CONCAT_WS(separator, str1, str2,...):它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符

COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段

select

concat_ws(',',constellation,blood_type),

concat_ws('|',collect_set(name))

from person_info group by concat_ws(',',constellation,blood_type);

collect_set去重  collect_list不去重

列转行

EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行

LATERAL VIEW

用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias

  解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

select movie,newcategory

from movie_info lateral view explode(category) tmp as newcategory;

38、窗口函数支持哪些函数

1、窗口函数

lead 往后数几行

lag 往前数几行

first_value 组内的第一行

last_value 组内的最后一行

2、聚合函数

avg

sum

count

min

max

3、分析函数

RANK 排名 可并列,当排名并列时,会跳号

ROW_NUMBER 排名/行号 不可并列,也不跳号

DENSE_RANK 可并列,当排名并列时,不会跳号

CUME_DIST 小于等于rank值的行数/总行数

PERCENT_RANK rank - 1/总行数-1

NTILE(x) 将所有数据均分为x份

39、窗口函数的语法

over(partition by 分组字段 order by 排序字段 rows between ...  and ...)

41、自定义udf函数的步骤

继承udf类 -> 实现evaluate函数 -> 打jar包  -> add jar ‘jar包路径’  -> 创建函数 create function 函数名 as ‘全类名’; -> 删除函数 drop function 函数名

1、创建一个工程

2、导入依赖

3、创建一个继承自udf的类

4、实现父类的evaluate()方法

该方法中书写业务需求

该方法的返回值类型不能是void,但可以返回null

5、导出jar包

6、把jar包导入linux

7、在hive中把jar包添加进来

add jar /opt/module/datas/hiveudf-1.0-snapshot.jar;

8、创建函数,加temporary(探普瑞)关键字,下次再进入hive,该函数就不可用了

create [temporary] function 函数名 as "主类名的全类名";

9、使用函数

10、删除函数

42、hive支持的存储格式1

textfile、sequencefile、orc(沃克)、Parquet

默认存储格式为textfile,明文存储,生产环境中几乎不用这种格式

textfile和sequencefile是基于行式存储

orc、Parquet是基于列式存储

43、hive的优化方式

1 fetch抓取(凡此)

2 本地模式

3 表的优化

4 设置map及reduce数

5 并行执行

6 严格模式

7 jvm重用

8 推测执行

9 压缩

10 执行计划

一、关系运算: 4 1. 等值比较: = 4 2. 不等值比较: 4 3. 小于比较: < 4 4. 小于等于比较: 5 6. 大于等于比较: >= 5 7. 空值判断: IS NULL 5 8. 非空判断: IS NOT NULL 6 9. LIKE比较: LIKE 6 10. JAVA的LIKE操作: RLIKE 6 11. REGEXP操作: REGEXP 7 二、数学运算: 7 1. 加法操作: + 7 2. 减法操作: - 7 3. 乘法操作: * 8 4. 除法操作: / 8 5. 取余操作: % 8 6. 位与操作: & 9 7. 位或操作: | 9 8. 位异或操作: ^ 9 9.位取反操作: ~ 10 三、逻辑运算: 10 1. 逻辑与操作: AND 10 2. 逻辑或操作: OR 10 3. 逻辑非操作: NOT 10 四、数值计算 11 1. 取整函数: round 11 2. 指定精度取整函数: round 11 3. 向下取整函数: floor 11 4. 向上取整函数: ceil 12 5. 向上取整函数: ceiling 12 6. 取随机数函数: rand 12 7. 自然指数函数: exp 13 8. 以10为底对数函数: log10 13 9. 以2为底对数函数: log2 13 10. 对数函数: log 13 11. 幂运算函数: pow 14 12. 幂运算函数: power 14 13. 开平方函数: sqrt 14 14. 二进制函数: bin 14 15. 十六进制函数: hex 15 16. 反转十六进制函数: unhex 15 17. 进制转换函数: conv 15 18. 绝对值函数: abs 16 19. 正取余函数: pmod 16 20. 正弦函数: sin 16 21. 反正弦函数: asin 16 22. 余弦函数: cos 17 23. 反余弦函数: acos 17 24. positive函数: positive 17 25. negative函数: negative 17 五、日期函数 18 1. UNIX时间戳转日期函数: from_unixtime 18 2. 获取当前UNIX时间戳函数: unix_timestamp 18 3. 日期转UNIX时间戳函数: unix_timestamp 18 4. 指定格式日期转UNIX时间戳函数: unix_timestamp 18 5. 日期时间转日期函数: to_date 19 6. 日期转年函数: year 19 7. 日期转月函数: month 19 8. 日期转天函数: day 19 9. 日期转小时函数: hour 20 10. 日期转分钟函数: minute 20 11. 日期转秒函数: second 20 12. 日期转周函数: weekofyear 20 13. 日期比较函数: datediff 21 14. 日期增加函数: date_add 21 15. 日期减少函数: date_sub 21 六、条件函数 21 1. If函数: if 21 2. 非空查找函数: COALESCE 22 3. 条件判断函数:CASE 22 4. 条件判断函数:CASE 22 七、字符串函数 23 1. 字符串长度函数:length 23 2. 字符串反转函数:reverse 23 3. 字符串连接函数:concat 23 4. 带分隔符字符串连接函数:concat_ws 23 5. 字符串截取函数:substr,substring 24 6. 字符串截取函数:substr,substring 24 7. 字符串转大写函数:upper,ucase 24 8. 字符串转小写函数:lower,lcase 25 9. 去空格函数:trim 25 10. 左边去空格函数:ltrim 25 11. 右边去空格函数:rtrim 25 12. 正则表达式替换函数:regexp_replace 26 13. 正则表达式解析函数:regexp_extract 26 14. URL解析函数:parse_url 26 15. json解析函数:get_json_object 27 16. 空格字符串函数:space 27 17. 重复字符串函数:repeat 27 18. 首字符ascii函数:ascii 28 19. 左补足函数:lpad 28 20. 右补足函数:rpad 28 21. 分割字符串函数: split 28 22. 集合查找函数: find_in_set 29 八、集合统计函数 29 1. 个数统计函数: count 29 2. 总和统计函数: sum 29 3. 平均值统计函数: avg 30 4. 最小值统计函数: min 30 5. 最大值统计函数: max 30 6. 非空集合总体变量函数: var_pop 30 7. 非空集合样本变量函数: var_samp 31 8. 总体标准偏离函数: stddev_pop 31 9. 样本标准偏离函数: stddev_samp 31 10.中位数函数: percentile 31 11. 中位数函数: percentile 31 12. 近似中位数函数: percentile_approx 32 13. 近似中位数函数: percentile_approx 32 14. 直方图: histogram_numeric 32 九、复合类型构建操作 32 1. Map类型构建: map 32 2. Struct类型构建: struct 33 3. array类型构建: array 33 十、复杂类型访问操作 33 1. array类型访问: A[n] 33 2. map类型访问: M[key] 34 3. struct类型访问: S.x 34 十一、复杂类型长度统计函数 34 1. Map类型长度函数: size(Map) 34 2. array类型长度函数: size(Array) 34 3. 类型转换函数 35
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值