hive语句操作
一:建表语句
1.建表
create table t_order(id string,create_time string,amount float,uid string)
row format delimited
fields terminated by ‘,’; //读取文件时以,作为分隔符
2.删除表
drop table t_order;
hive会从元数据库中清除关于这个表的信息;
hive还会从hdfs中删除这个表的表目录;
3.创建带分区的表
create table t_access(ip string,url string,access_time string)
partitioned by(dt string)
row format delimited
fields terminated by ‘,’;
//注意:分区字段不能是表定义中的已存在字段,否组会冲突;以为分区字段也会被当成数组字段值被返回,其实这是一个伪字段;
向指定分区导入数据:load data local inpath ‘/root/access.log.2017-08-04.log’ into table t_access partition(dt=‘20170804’);
针对指定分区进行查询:select count(*) from t_access where dt=‘20170804’;
//一个表可以带有多个分区!!!
查看表的分区:show partitions t_access;
4.导入文件到数据库
load data local inpath ‘/root/access.log.2017-08-04.log’ into table t_access ;
5.通过已存在表来建表
create table t_user_2 like t_user;
//新建的t_user_2表结构定义与源表t_user一致,但是没有数据
6.建表的同时插入数据
create table t_access_user as select ip,url from t_access;
//创建的表的字段与查询语句的字段是一样的
二:数据文件的导入和导出
1.在hive的交互式shell中用hive命令来导入本地数据到表目录
hive>load data local inpath ‘/root/order.data.2’ into table t_order;
2.用hive命令导入hdfs中的数据文件到表目录
hive>load data inpath ‘/access.log.2017-08-06.log’ into table t_access partition(dt=‘20170806’);
3.手动用hdfs命令,将文件放入表目录
直接手动操作
4.将hive表中的数据导入HDFS的文件
insert overwrite directory ‘/root/access-data’
row format delimited fields terminated by ‘,’
select * from t_access;
5.将hive表中的数据导入本地磁盘文件
insert overwrite local directory ‘/root/access-data’
row format delimited fields terminated by ‘,’
select * from t_access limit 100000;
6:hive的文件格式
HIVE支持很多种文件格式: SEQUENCE FILE | TEXT FILE | PARQUET FILE | RC FILE
create table t_pq(movie string,rate int) stored as textfile;
create table t_pq(movie string,rate int) stored as sequencefile;
create table t_pq(movie string,rate int) stored as parquetfile;
三:字段类型
数字类型
tinyint (1-byte signed integer, from -128 to 127)
smallint (2-byte signed integer, from -32,768 to 32,767)
int/integer (4-byte signed integer, from -2,147,483,648 to 2,147,483,647)
bigint (8-byte signed integer, from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807)
float (4-byte single precision floating point number)
double (8-byte double precision floating point number)
示例:
create table t_test(a string ,b int,c bigint,d float,e double,f tinyint,g smallint)
日期类型
TIMESTAMP (Note: Only available starting with Hive 0.8.0) 【本质是长整型】
DATE (Note: Only available starting with Hive 0.12.0)
字符串类型
STRING
VARCHAR (Note: Only available starting with Hive 0.12.0)
CHAR (Note: Only available starting with Hive 0.13.0)
其他类型
BOOLEAN
BINARY (Note: Only available starting with Hive 0.8.0)
复合类型
arrays: ARRAY<data_type> 例:字段名 array
collection items terminated by ‘:’ //内容中以:分割的都放入array
maps: MAP<primitive_type, data_type> 例:字段名 map<string,string> //类似于字典操作
collection items terminated by ‘#’ //内容中以#分割的都放入map
map keys terminated by ‘:’; //map中每个字段:为分割符,前面是k,后面是v
select may类型字段名[‘key值’] as key中的值 from 表名; //取map指定字段的key值
select map_keys(may类型字段名) as 字段名 表名; //取map字段中的所有key(返回一个数组)
select map_values(may类型字段名) from 表名; //获取所有value(返回一个数组,在查询后加[]课返回指定位置数据)
structs: STRUCT<col_name : data_type, …> //可以存放多种数据类型
四:基本语句
1.基本查询示例
select * from t_access;
select count(*) from t_access;
select max(ip) from t_access;
sql中的单行函数与聚合函数
select substr(name,0,2), age from t_user; //截取0-2
select name, sex, max(age) from t_user group by sex; //取出最大age,以sex排序
2.条件查询
select * from t_access where access_time<‘2017-08-06 15:30:20’
select * from t_access where access_time<‘2017-08-06 16:30:20’ and ip>‘192.168.33.3’;
3.内连接
// 指定join条件
select a.* ,b.* from t_a a join t_b b on a.name=b.name; 以a,b的name作为条件,对a,b两个表进行内连接查询(下面相同)
4.左外链接
select a.* ,b.* from t_a a left outer join t_b b on a.name=b.name;
5.右外连接
select a.* ,b.* from t_a a right outer join t_b b on a.name=b.name;
6.全外链接
select a.* ,b.* from t_a a full outer join t_b b on a.name=b.name;
7.左半连接
select a.* from t_a a left semi join t_b b on a.name=b.name;
8.分组聚合
select dt,count(*),max(ip) as cnt from t_access group by dt; //所有分组
select dt,count(*),max(ip) as cnt from t_access group by dt having dt>‘20170804’; //指定分组
注意: 一旦有group by子句,那么,在select子句中就不能有 (分组字段,聚合函数) 以外的字段
select 要求查询的字段,只能在一组数据中产生一个结果。一组产生一个结果。
或者说:select中出现的字段要么是分组字段,要么是聚合函数(对多条数据产生一个值)
如:ip不唯一,那么在使用group by url 时不能出现select ip!!!!
9:子查询
子查询如同sql语句使用,这里不做讲解
五:内置函数
查看全部函数:show functions;
1.类型转换函数
cast与java中的类型强转类似
select cast(“5” as int) from dual;
select cast(“2017-08-03” as date) ;
2.数学函数
select round(5.4); – 5
select round(5.1345,3); --5.135
select ceil(5.4); // select ceiling(5.4); – 6
select floor(5.4); – 5
select abs(-5.4); – 5.4
select greatest(3,5); – 5
select greatest(3,5,6); – 6
select least(3,5,6);
3.字符串函数
select substr(“abcdefg”,2,3); //截取2.3两个字符串
select concat(“ab”,“xy”) from dual; //拼接字符串
select concat_ws(".",“192”,“168”,“33”,“44”) from dual; //拼接字符串,中间以.作为连接
select length(“192.168.33.44”) from dual; //计算字符串长度
select split(“192.168.33.44”,"\ \ ."); //把一个字符串按照他指定的符号进行分割,返回到一个数组
select upper(name) //把name字段中的值全部转化为大写
select current_date; //常量,获取当前系统时间
select from_unixtime(unix_timestamp(),“yyyy/MM/dd HH:mm:ss”); //unix时间戳转字符串
select unix_timestamp(“2017/08/10 17:50:30”,“yyyy/MM/dd HH:mm:ss”); //字符串转unix时间戳
select explode(subjects) as sub from t_stu_subject; //通过explode 对arrary类型字段进行炸裂,形成一张单独表
select id,name,tmp.sub from t_stu_subject lateral view explode(subjects) tmp as sub; //lateral生成横向连接,类似左连接
select moive_name,array_contains(actors,‘吴刚’) from t_movie; //contains函数在array类字段actors中搜索,如果存在返回true
select sort_array(array(‘c’,‘b’,‘a’)); //对array中的值进行排序输出
select size(actors) as actor_number from t_movie; //对array中的值进行计数,返回一个int类型
//size(Map<K.V>) 返回一个int值
//map_keys(Map<K.V>) 返回一个数组
//map_values(Map<K.V>) 返回一个数组
4.条件函数
1:case:
select id,name,
case
when age<28 then ‘youngth’
when age>27 and age<40 then ‘zhongnian’
else ‘old’
end
from t_user;
2:if:
select id,if(age>25,‘working’,‘worked’) from t_user;
select moive_name,if(array_contains(actors,‘吴刚’),‘好电影’,'烂电影‘)from t_move;
5.json解析函数
create table t_rate2 as
select json_tuple(json,‘movie’,‘rate’,‘timeStamp’,‘uid’) as (movie, rate, ts, uid)
from t_tatingjson;
//注意: json_tuple不会对嵌套的json进行解析,会将嵌套的json直接当作某一个字段的value返回,可以通过用自定以函数的方式对嵌套的json进行解析 例:minute(from_unixtime(cast(ts as bigint))) as minute,from_unixtime(cast(ts as bigint)) as ts
6.分析函数
select id,age,name,sex,
row_number() over(partition by sex order by age desc) as rank
from t_rownumber
使用row_number函数,对表中的数据按照性别分组,按照年龄倒序排序并进行标记
六:常用操作
1.删除一个已经存在的表
drop table employee;
2.修改一个表明,重命名
alter table old_name rename to new_name;
3.修改一个字段的数据类型或者名字,并修改顺序
ALTER TABLE 表名 CHANGE COLUMN 旧字段名 新的字段名(如果不变就保持原字段) 字段类型(若不变就采用原来的字段) COMMENT ‘新的字段备注’ AFTER 列名;
4.给某一个表增加某一列的信息
alter table tab_name add columns(value1 string);
5.重命名表
ALTER TABLE table_name RENAME TO new_table_name;
6.修改表中某一列的属性
alter table tab_name set tblproperties(‘value’=‘hello’);
7.修改某一个表的某一列的信息
alter table tab_name change column key key_1 int comment ‘h’ after value;