Hive语法相关

一些常用的hive相关的语法,详细请查看官网:https://cwiki.apache.org/confluence/display/Hive

DDL

  1. create
    创建数据库:create database [if not exists] 数据库名;
    创建表:create table [external] 表名
    (column1 type1,
    column2 type2,
    …)
    row format delimited fields terminated by ‘列分隔符’
    stored as textfile/rcfile;
    如果是内部表,默认存储在/user/hive/warehouse下,如果是external表,如果不想让其存放在hive默认目录下的话,可使用location指定需要在hdfs上的存储路径,如果此时再把需要加载的数据放在external表在hdfs上的存储目录下的话,数据将会直接加载到external表中,不需要再load加载数据。
    复制表结构,只能复制全部表结构:create table 新表 like 旧表;
    复制表结构及表数据,可选择部分字段复制:create table 新表 as select * from 旧表;
  2. drop
    删除数据库(cascade强制删除数据库):drop database 数据库名 [cascade] ;
    删除表:drop table [if exists]表名;
  3. alter
    修改表名:alter table table_name rename to new_table_name;
  4. truncate
    清空表数据:truncate table 表名;
  5. show
    查看数据库:show databases;
    查看当前数据库下所有表:show tables;
    查看某个表的建表语句:show create table 表名;
    查看某个表的字段:show columns from 表名;
  6. describe
    查看某表的所有字段及字段类型:desc 表名;
    desc formated 表名;

DML
1.load
加载表数据:load data [local] inpath ‘本地路径数据/hdfs路径数据’ [overwrite] into table 表名;
2.insert
插入表数据(该表1必须先创建):insert into table 表1 select column1,column2…| * from 表2;
导出表中的数据到本地或者hdfs:
insert overwrite [local] directory ‘本地路径/hdfs路径’
[row format delimited fields terminated by ‘,’]
select column1,column2…| * from 表名;
3.update/
4.delete/
5.merge
6.import
7.export,
8.explain plan

关于hive中order by,sort by,cluster by,distribute by的区别?
1.order by是全局排序,当使用order by的时候reduce task的个数为1个即最终输出文件也会只有一个,那么此时就是全局排序,如果此时hive为严格模式的话需要加limit。 set hive.mapred.mode=xx;
2.sort by是局部排序,比如说设置reduce task的个数为3个的时候即最终输出的文件也会有三个,那么此时使用sort by即可实现每个文件内的数据是有序的,不能保证全局有序,但是如果reduce task的个数为 一个的时候,那么此时也相当于全局有序。。set mapred.reduce.tasks=xx;默认-1 表示1个。

eg:首先将reduce的个数设置为3个,然后使用sort by实现三个输出文件内分别升序,最终结果将会生成三个文件,并且通过查看,每个文件内将会按照sal字段升序

    hive (hwzhdb)> set mapred.reduce.tasks=3;
    hive (hwzhdb)> insert overwrite local directory './data/sortby' 
                 > row format delimited fields terminated by ','
                 > select * from emp sort by sal ;
                .....执行mr....
    [hadoop@hadoop001 data]$ cd sortby/
    [hadoop@hadoop001 sortby]$ ll
    total 12
    -rw-r--r--. 1 hadoop hadoop 367 Jul 20 14:34 000000_0
    -rw-r--r--. 1 hadoop hadoop 361 Jul 20 14:34 000001_0
    -rw-r--r--. 1 hadoop hadoop 116 Jul 20 14:34 000002_0

但是这三个文件是根据哪个字段进行划分的呢?
其实是因为hive对单独使用sort by的这种有个算法,是随机生成的这三个文件,并不是根据某个字段值进行分区的,所以针对同一份数据集,无论你执行多少次这个语句,最终生成的三个文件中的内容都是一样的,不会改变

3.distribute by 不是排序,而是可以按照一定的规则将数据分发(此处的分发规则是%reduce的个数然后根据余数将数据分发到同一个reduce上)到不同的reduce上,然后可以结合使用sort by进行局部排序

 hive (hwzhdb)> set mapred.reduce.tasks=3;
 hive (hwzhdb)> insert overwrite local directory './data/distributeByAndSortBy' 
                     > row format delimited fields terminated by ','
                     > select * from emp distribute by deptno sort by sal ;
  这种方式最终也是生成三个文件,只不过跟单独使用sort by不同的是这三个文件是根据对
  deptno进行hash,然后%reduce的个数,将数据分散到三个文件中的。                   

4.cluster by 是distribute by+sort by的结合,就是说如果你的distribute by后面的字段跟sort by后面的字段一致的话就可以简写为cluster by,但是这种方式只能倒序,不能指定asc或者desc

hive内置函数相关?
查看内置函数命令:show functions;
查看某一个函数说明:desc function 方法名;
查看某一个函数说明并且带有example的:desc function extended 方法名;

类Oracle创建一个dual表,供我们方便使用
hive (hwzhdb)> create table dual(x string);
OK
Time taken: 0.857 seconds
hive (hwzhdb)> insert into table dual values('');
			...mr...

时间函数相关:yyyy-MM-dd HH:mm:ss
current_date:2019-07-20

current_timestamp:2019-07-20 16:40:05.975

unix_timestamp:传入一个date,然后指定时间格式,返回一个timestamp
eg:
hive (hwzhdb)> select unix_timestamp('2019-7-21 11:26','yyyy-MM-dd HH:mm') from dual;
OK
_c0
1563679560

from_unixtime:传入一个timestamp,然后指定要返回的date格式,返回一个date
eg:
hive (hwzhdb)> select from_unixtime(1563679560,'yyyy-MM-dd HH:mm:ss') from dual;
OK
_c0
2019-07-21 11:26:00

-----------------
date_add:增加/减少天数
add_months:增加/减少月份
-----------------
year:返回一个date的年份
month:返回一个date的月份
day:返回一个date的天
hour:返回一个date的小时
minute:返回一个date的分钟
second:返回一个date的秒

数值相关的:
abs:取绝对值
ceil:对于小数,向上取整
floor:对于小数,向下取整
round:对于小数,四舍五入,可以传入第二个参数设置精度(即小数点后保留几位)
least:传入多个数字,返回其中最小的一个数字
greatest:传入多个数字,返回其中最大的一个数字

字符串相关的:
substr:字符串截取
eg:
SELECT substr(‘Facebook’, 5) FROM dual; --从正数第五个一直截取到末尾
‘book’
SELECT substr(‘Facebook’, -5) FROM dual; --从倒数第五个的位置一直截取到末尾
‘ebook’
SELECT substr(‘Facebook’, 5, 1) FROM dual; --从正数第五个的位置,截取一个
‘b’
concat:字符串拼接
eg:
SELECT concat(‘abc’,‘def’) FROM dual;
‘abcdef’
concat_ws:字符串拼接,能够指定拼接符
eg:
SELECT concat_ws(’.’, ‘www’, array(‘facebook’, ‘com’)) FROM dual;
‘www.facebook.com’

其它一些常用函数:
1.to_date:将字符串日期转换为date格式
2.cast:类型转换函数,类似java中Inter.parse,可以将字符串数值转为数值类型
3.split:字符串切分函数
eg: SELECT split(‘oneAtwoBthreeC’, ‘[ABC]’) FROM dual;
[“one”, “two”, “three”]

4.explode:行转列函数,一行变多行,可以和split结合使用实现hql的wc功能 ,

 > eg: 造一份数据模拟hql实现wc
 > [hadoop@hadoop001 data]$ cat wc.txt  
 > yuwen#shuxue#yingyu 
 > yuwen#shuxue#shuxue 
 > yingyu
  hive (hwzhdb)> create table wc(
              > subjects string
              > );
 hive (hwzhdb)> load data local inpath '/home/hadoop/data/wc.txt' into table wc;
 hive (hwzhdb)> select tmp.word,count(1)  conum
 				from
                 (
                 select explode(split(subjects,'#')) as word 
                 from wc
                 ) tmp 
                 group by tmp.word
                 order by conum desc;
         result:
         tmp.word        conum
         shuxue  3
         yuwen   2
         yingyu  2               
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值