赞
踩
常用的 : 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’ 行分隔符
略
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;//查看分区结构
略
语法: load data [local] inpath ‘opt/module/datas/student.txt’ [overwirte] into table student [patition(partcol1=val1)];
解释: overwrite 表示覆盖数据,否则表示追加
基本用法与sql相同,演示 : insert overwrite xxxx select xxxx
create xxx as select xx
略
import table table1 partition(month = “20200801”) from ‘/path’
数据应该先export导出再导入
示例:insert overwriter local directory ‘/path’ ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’ select * from student
直接将存储数据的文件get
export table default.student to’/path’;
truncate table student;trncate命令只能山粗管理表中的数据
与sql相同
与sql相同
select count(*) cnt from emp; //总行数
select max(sal) max_sal from emp; // 最大值
min,sum,avg //最小值,总和,平均值
select * from emp limit 5; //只取前五条数据
between/in/is null
and/or/not
group by语句常和聚合函数一起使用,按照某个标准进行分组,然后对每个组执行聚合操作
例如:计算每个岗位中薪水最高的
select t.deptno,t.job,max(t.sal) from emp t group by t.deptno,t.job;
查询将按照每个部门每个岗位进行分组后 完成聚合 输出想要的数据,而不是将每条数据都输出
having 与 where不同点
示例: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 使用
hive支持等值连接,不支持非等值连接
优化:hive会对每个join连接对象启动一个mapreduce任务,当对三个及以上表进行join时,如果每个on子句使用相同的连接条件,那么只产生一个mapreduce任务
只有一个reducer
asc 升序(默认) desc 降序
select * from emp order by sal desc;
sort by 每个reducer内部排序,因此可以通过设置多个reducer来提高效率
类似于MR中的自定义分区(partition),结合sort by 使用
insert overwrite local directory ‘/path’ select * from emp distribute by deptno sort by empno desc;
按照部门编号进行分区,再按照员工编号降序排序
注意:
当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代替
例如:求男女各有多少人 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
将多列数据转换为行,类比聚合函数
相关函数说明:
我们使用时,常分组后统计该组状况。例如统计 白羊座的有哪个同学
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;
函数说明:
开窗函数可以类别滑动窗口,它将一些函数放在一个窗口从而进行聚合等操作。开窗函数聚焦的问题在于从哪开窗,多大的窗。
示例:
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() 排序相同时会重复,总数不会变。适用于班级排名
DENSE_RANK() 排序相同时会重复,总数会减少
ROW_NUMBER() 会根据顺序计算
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。