Hive基础知识点整理

hive数据类型

基本数据类型

常用的 : INT BIGINT DOUBLE STRING

集合数据类型

STRUCT: struct(street:string,city:string)

MAP: map(string,int)

ARRAY: array(string)

**注意:**我们在导入数据是一行一行导入,因此我们需要额外的字段来匹配文件中的字符

字段解释

row format delimited fields terminated by ‘,’ 指定了逗号作为列分隔符

collection items terminated by ‘_’ 集合数据中的多个元素,例如数组中多个元素使用_隔开

map keys terminated by ‘:’ map中key与value的分隔符

lines terminated by ‘\n’ 行分隔符

DDL数据定义

创建数据库

查询数据库
  • show databases;
  • show databases like ‘db’;
  • use db_hive;
  • desc database extended db_hive; //显示数据库详细信息
  • alter database db_hive set dbproperties(‘createtime’=‘XXXXXXX’) //修改数据库
删除数据库

drop 略

创建表
查看详情
    1.建表语法
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]
2.字段解释说明 
(1)CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。
(2)EXTERNAL关键字可以让用户创建一个外部表,在建表的同时可以指定一个指向实际数据的路径(LOCATION),在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
(3)COMMENT:为表和列添加注释。
(4)PARTITIONED BY创建分区表
(5)CLUSTERED BY创建分桶表
(6)SORTED BY不常用,对桶中的一个或多个列另外排序
(7)ROW FORMAT 
DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]
        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] 
   | SERDE 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的简称, hive使用Serde进行行对象的序列与反序列化。
(8)STORED AS指定存储文件类型
常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)
如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。
(9)LOCATION :指定表在HDFS上的存储位置。
(10)AS:后跟查询语句,根据查询结果创建表。
(11)LIKE允许用户复制现有的表结构,但是不复制数据。
    
管理表(内部表)

默认创建,删除时数据一起删除,hive可以控制数据的声明周期

外部表

删除时进删除 用来描述表的元数据信息。使用external关键字创建

再创建外部表的同时应该指定外部表的 路径

管理表与外部表的相互转换

通过alter修改表的属性

分区表

hive中分区就是分目录。一个分区对应一个独立的hdfs上的文件夹。

示例(创建):xxxxx partitioned by (month string) xxx

注意,我们这里创建分区表只是描述 这个表将以 什么作为分区标准。而导入数据时还需另外指名分区的属性,才能真正完成分区

示例(加载): xxxx default.dept_partition partition(month = ‘20200801’)

在加载分区数据时,必须指名分区

示例(查询): select * from table1 where month = “20200801”

​ union

​ select * from table2 where month = “20200802”

查询多个分区时,应该使用联合查询

示例(增删):alter table table1 add/drop partition(month = “20200801”) partition(month=“20200802”)

示例: show partition table1;//查看多少个分区

​ desc formatted table1;//查看分区结构

二级分区

DML数据操作

数据导入
装载数据(load)

语法: load data [local] inpath ‘opt/module/datas/student.txt’ [overwirte] into table student [patition(partcol1=val1)];

解释: overwrite 表示覆盖数据,否则表示追加

插入数据(Insert)

基本用法与sql相同,演示 : insert overwrite xxxx select xxxx

创建表同时加载数据(as select)

create xxx as select xx

创建表同时通过location加载数据路径

import导入数据到指定的表中

import table table1 partition(month = “20200801”) from ‘/path’

数据应该先export导出再导入

数据导出
Insert导出

示例:insert overwriter local directory ‘/path’ ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’ select * from student

Hadoop命令导出

直接将存储数据的文件get

Hive shell导出
export导出

export table default.student to’/path’;

Sqoop导出
清除数据

truncate table student;trncate命令只能山粗管理表中的数据

查询(极重要)

基本查询(select from)

与sql相同

别名查询(as)

与sql相同

常用函数(常用)
select count(*) cnt from emp; //总行数
select max(sal) max_sal from emp; // 最大值
min,sum,avg //最小值,总和,平均值
Limit语句

select * from emp limit 5; //只取前五条数据

where
比较运算符

between/in/is null

like 与 rlike(可通过正则表达式匹配)
逻辑运算符

and/or/not

分组
group by语句

group by语句常和聚合函数一起使用,按照某个标准进行分组,然后对每个组执行聚合操作

例如:计算每个岗位中薪水最高的

select t.deptno,t.job,max(t.sal) from emp t group by t.deptno,t.job;

查询将按照每个部门每个岗位进行分组后 完成聚合 输出想要的数据,而不是将每条数据都输出

having语句

having 与 where不同点

  • where后面不能写分组函数,而having后面可以使用分组函数
  • having只用于 group by 分组统计语句

示例:select t.deptno,t.job,avg(t.sal) avg_sal from emp t group by t.deptno having avg_sal>2000;

原先我们只统计每个部门的平均工资,加上having以后我们可以指定查看平均工资超过了2000的部门。注意having只能跟group by 使用

Join语句
等值Join

hive支持等值连接,不支持非等值连接

  • 内连接 join
  • 左外连接 left join
  • 右外连接 right join
  • 满外链接 full join msql不支持满外连接
  • 条件 on xxxx

优化:hive会对每个join连接对象启动一个mapreduce任务,当对三个及以上表进行join时,如果每个on子句使用相同的连接条件,那么只产生一个mapreduce任务

  • on子句中暂不支持or
排序
全局排序(order by)

只有一个reducer

asc 升序(默认) desc 降序

select * from emp order by sal desc;

sort by 每个reducer内部排序,因此可以通过设置多个reducer来提高效率

分区排序(distribute by)

类似于MR中的自定义分区(partition),结合sort by 使用

insert overwrite local directory ‘/path’ select * from emp distribute by deptno sort by empno desc;

按照部门编号进行分区,再按照员工编号降序排序

注意:

  • distribute by的分区规则是根据分区字段的hash码与reduce的个数进行模除以后,余数相同的分到一个区
  • hive要求distribute by 必须卸载sort by 之前
cluster by

当distibute by 与sort by字段相同时可以使用cluster by代替,但是只能升序排

分桶及抽样查询

对于一张表或者分区,hive可以将进一步组长成桶,是更为细粒度得的数据划分

分区针对的是数据的存储路径,分桶针对的是数据文件

创建一个分桶表

create table stu_buck(id int,name string)

cluster by(id) into 4 buckets row format delimited fields termianted by ‘\t’;

使用粪桶表需要事先设置分桶属性 : set.hive.enforce.bucketing=true;

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

分桶抽样查询

select * from stu_buck tablesample(bucket 1 out of 4 on id)

解释:tablesample(bucket x out of y on id)

y表示抽取多少个桶数据,y必须为桶的倍数或者因子

x表示从哪个桶开始抽取数据,如果有多个分区,以后的分区号 = 当前分区号+y

x<=y必须成立,否则报错

其他常用查询手段
空字段赋值

select comm,nvl(comm,-1) from emp;

如果员工的comm字段为null,用-1代替

case when

例如:求男女各有多少人 sum(case sex when ‘男’ then 1 else 0 end) male_count,sum(case sex when’女’ then 1 else 0 end) female_count

当性别为男时 male_count+1 否则 male_count+0

行转列

将多列数据转换为行,类比聚合函数

相关函数说明:

  • CONCAT(string A/col,string B/col,…):返回字符串拼接后的结果
  • CONCAT_WS(separatot,str,str,…):使用分隔符连接
  • CONCAT_SET(col):函数只接受基本数据类型,将某个字段的值进行去重汇总,产生array类型字段

我们使用时,常分组后统计该组状况。例如统计 白羊座的有哪个同学

列转行

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

lateral view:用法 lateral view udtf(expression) tableAlias as columnAlias。用于和split,explode等UDTF一起使用,他能将一列数据拆分成多行数据,再次基础上再进行聚合

例: lateral view explode(category) table_tem as category_name;

窗口函数(开窗函数)

函数说明:

  • over(): 指定分析函数工作的数据窗口大小,这个窗口大小可能随着行的变化而变化
  • current row : 当前行
  • n perceding: 往前n行数据
  • n following: 往后n行数据
  • unbouded:起点,unbouded preceding 表示从前面的起点,unbouded follwing 表示到后面终点
  • lag(col,n,default_val):往前第n行数据
  • lead(col,n,default):往后第n行数据
  • ntile(n):将有序分区中的行分发到指定数据的组中,各组中有编号,编号从1开始,对于每行,ntile返回此行所属的组的编号。将行分组

开窗函数可以类别滑动窗口,它将一些函数放在一个窗口从而进行聚合等操作。开窗函数聚焦的问题在于从哪开窗,多大的窗。

示例:

1、查询在2017年4月份购买过的顾客及总人数

select name,count(*) over() from business where substring(orderdate,1,7) = ‘2017-04’ group by name;

开窗函数容易与分组函数混淆,两种不同之处在于 上述例子中如果删除over()函数,那么分组将按照整个表进行分组,就会统计整个够买次数

2、查询顾客的购买明细及月购买总额

select name,orderdate,cost,sum(cost) over(partition by month(orderdate)) from business;

对每个月开窗,由此统计数额

rank函数

RANK() 排序相同时会重复,总数不会变。适用于班级排名

DENSE_RANK() 排序相同时会重复,总数会减少

ROW_NUMBER() 会根据顺序计算

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Hive是一个基于Hadoop的数据仓库工具,它提供了一种类似SQL的查询语言,用于将结构化数据存储在Hadoop集群上,并进行查询和分析。下面是一些关于Hive基础知识的选择题: 1. Hive的主要特点是什么? a) 提供类似SQL的查询语言 b) 可以在Hadoop集群上进行数据存储和分析 c) 可以处理结构化和半结构化数据 d) 所有选项都正确 答案:d) 所有选项都正确 2. Hive将数据存储在哪里? a) HBase b) Hadoop Distributed File System (HDFS) c) Cassandra d) MySQL 答案:b) Hadoop Distributed File System (HDFS) 3. Hive中的表可以与以下哪种文件格式关联? a) CSV b) JSON c) Parquet d) 所有选项都正确 答案:d) 所有选项都正确 4. Hive使用什么来对数据进行分区和排序? a) HDFS b) Tez c) MapReduce d) Apache Spark 答案:c) MapReduce 5. Hive中的数据查询和分析通过什么来实现? a) Hive Query Language (HQL) b) Structured Query Language (SQL) c) Apache Hive d) Apache Hadoop 答案:a) Hive Query Language (HQL) 总之,Hive是一个基于Hadoop的数据仓库工具,具有类似SQL的查询语言,可以在Hadoop集群上存储和分析结构化和半结构化数据。它使用HDFS来存储数据,可以与多种文件格式关联,并使用MapReduce来进行数据分区和排序。数据查询和分析通过Hive Query Language (HQL)来实现。 ### 回答2: Hive是一款基于Hadoop的数据仓库工具,它提供了方便的数据查询和分析的功能。接下来我将回答一些关于Hive基础知识的选择题。 1. Hive中的表是如何定义的? 答案:C. 使用HiveQL语句创建表。 2. 在Hive中,数据是如何存储的? 答案:B. 在Hadoop的HDFS文件系统中。 3. Hive中的分区是用来做什么的? 答案:A. 对数据进行逻辑上的划分,便于查询优化和数据管理。 4. 在Hive中,可以使用哪种语言进行数据查询? 答案:D. HiveQL。 5. 在Hive中,用来处理复杂逻辑和数据运算的是什么? 答案:B. Hive的UDF(用户定义函数)和UDAF(用户定义聚合函数)。 6. Hive的数据存储格式有哪些? 答案:A. 文本文件(TextFile)、序列文件(SequenceFile)和Parquet等。 7. Hive表中的数据可以通过什么方式进行加载? 答案:C. 使用Hive的LOAD DATA语句。 8. 在Hive中,用来创建管理表结构的是什么? 答案:B. Hive的元数据存储。 9. Hive的优势是什么? 答案:C. 简化了对Hadoop数据的查询和分析。 10. 使用Hive时,可以通过什么方式进行数据的导入和导出? 答案:D. 使用Hive的导入和导出命令。 以上是关于Hive基础知识的一些选择题的答案。Hive是一个功能强大且易于使用的工具,可以帮助用户更好地处理和分析大数据。掌握Hive基础知识对于进行数据仓库的建设和数据分析工作非常重要。 ### 回答3: Hive是一个开源的数据仓库基础架构,运行在Hadoop集群上。以下是关于Hive的基础知识选择题的回答: 1. Hive中的数据存储在哪里? 答:Hive中的数据存储在Hadoop分布式文件系统(HDFS)中。 2. Hive中的数据是如何组织的? 答:Hive中的数据是以表(Tables)的形式进行组织的。 3. Hive中的表的结构是如何定义的? 答:Hive中的表的结构是通过DDL语句来定义的,包括表的名称、列名称、数据类型等信息。 4. Hive中的查询语言是什么? 答:Hive中的查询语言类似于SQL,称为HiveQL或HQL。 5. Hive中的查询语句是如何转换为MapReduce作业的? 答:Hive将查询语句转换为逻辑查询计划,然后将逻辑查询计划转换为物理查询计划,最后将物理查询计划转换为MapReduce作业。 6. Hive中的分区表是什么? 答:Hive中的分区表是按照一个或多个列的值分成不同的目录,并且每个目录下存储相应分区的数据。 7. Hive中的桶是什么? 答:Hive中的桶是将数据分成固定数量的文件的一种方式,目的是提高查询性能。 8. Hive中的内部表和外部表有什么区别? 答:内部表的数据和元数据都由Hive管理,删除内部表时会删除表的数据;而外部表的数据和元数据存储在外部的文件系统中,删除外部表时只会删除元数据。 9. Hive中的UDF是什么? 答:UDF全称为用户定义函数(User-Defined Functions),是由用户自定义的用于特定数据处理操作的函数。 10. Hive中的压缩是如何实现的? 答:Hive中的压缩是通过执行MapReduce作业时将数据进行压缩,以减少数据的存储空间和提高查询性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值