hive中hql语法总结

1.建库语句:
    CREATE DATABASE [IF NOT EXISTS] database_name
    [COMMENT database_comment]
    [LOCATION hdfs_path]
    [WITH DBPROPERTIES (property_name=property_value, ...)];
        例:
            create DATABASE if NOT EXISTS hive_db2
            comment "my first database"
            location "/hive_db2"
2.库的修改:
    alter database hive_db2 set DBPROPERTIES ("createtime"="2018-12-19");
3.库的删除
    drop database db_hive cascade if exists; -- 删除存在表的数据库
3.建表语句:
    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] 
    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, ...)]
    [STORED AS file_format] Textfile
    [LOCATION hdfs_path]
    [TBLPROPERTIES (property_name=property_value, ...)]
    [AS select_statement]
        例1:
            create table student2(id int COMMENT "xuehao", name string COMMENT "mingzi")
            COMMENT "xueshengbiao"
            ROW format delimited
            fields terminated by '\t'
            STORED as Textfile
            location '/student2' -- 直接加载该目录下的数据文件到表中
            TBLPROPERTIES ("createtime"="2018-12-18");
        例2:
            create table student(id int, name string)
            row format delimited
            fields terminated by '\t';
            load data local inpath '/opt/module/datas/student.txt' into table student;
        例3:
            create table student4 like student2; -- 仅复制表结构
4.导入数据语句
    4.1 不加local则导入hdfs上文件,但会剪贴原文件,local本地仅粘贴
            load data [local] inpath '/opt/module/datas/student.txt' 
            [overwrite] into table student [partition (partcol1=val1,…)];
    4.2 创建表并导入数据(依据以存在的表)
            create table student6 as select * from student; -- 仅导入数据,不会导入其他细节属性 --被创建表不能是外部表 -- 被创建表不支持分区及分桶
    4.3 覆盖插入
            insert overwrite table student3 select * from student;
    4.4 插入带分区的表
            insert into table stu_par partition(month = '08') select id ,name from stu_par where month = '09';
    4.5 将单表中数据导入多表
            from student
            insert into table student4 select *
            insert into table student5 select *;
    4.6 多分区导入单表
            from stu_par
            insert into table stu_par partition(month = '06')
            select id ,name where month = '08'
            insert into table stu_par partition(month = '07')
            select id,name where month = '10';
5.表的修改操作
    5.1 修改表的属性
            alter table stu_ex set TBLPROPERTIES ('EXTERNAL' = 'TRUE');
    5.2 重命名表名
            alter table student4 rename to student3;
    5.3 修改表的serde属性(序列化和反序列化)
        alter table table_name set serdepropertyes('field.delim'='\t');
6.列的更新操作
    6.1 修改列语法
        ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]
    6.2 增加或替换列语法
        ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...) 
        例1:
            增加列:alter table student2 add COLUMNS (score double);
        例2:
            修改列:alter table student2 CHANGE COLUMN score score int AFTER id;
        例3:
            替换列(全部替换):alter table student2 replace COLUMNS (id int, name string);
7.带有分区的表
    7.0 查看分区
            show partitions table_name;
    7.1 创建单个分区
            create table stu_par(id int, name string)
            partitioned by (month string)
            ROW format delimited
            FIELDS terminated by '\t';
        -- 错误示例
            create table stu_par2(id int, name string)
            partitioned by (id int)
            ROW format delimited
            FIELDS terminated by '\t';  错!!!!(不能以数据库字段作为分区)
        -- 加载数据到指定分区(分区不存在则自动创建)
            load data local inpath '/opt/module/datas/student.txt' into table stu_par partition(month = '12');
            load data local inpath '/opt/module/datas/student.txt' into table stu_par partition(month = '11');

        -- 合并分区查询结果
            select * from stu_par where month = '11'
            union
            select * from stu_par where month = '12';
    7.2 增加多个分区
        alter table stu_par add partition (month = '08') partition(month='07');
    7.3 删除多个分区
        alter table stu_par drop partition(month='08'),partition(month='09');
    7.4 创建多级分区
        create table stu_par2(id int, name string)
        partitioned  by (month string, day string)
        row format delimited
        FIELDS terminated by '\t';
    7.5 导入数据到多级分区
        load data local inpath '/opt/module/datas/student.txt' into table stu_par2 
        partition (month='12',day='19');
    7.6 向多级分区增加分区
        alter table stu_par2 add partition(month = '12', day = '17');
    7.7 查询多级分区中的数据
        select * from stu_par2 where day = '18';
    7.8 修复分区(也可以使用添加分区的语句)
        msck repair table dept_partition2;
8.创建外部表(删除表不会删除表中数据,仅删除表的元数据)
    create external table stu_ex2(id int, name string)
    ROW format delimited
    FIELDS terminated by '\t'
    location '/student';
    8.1 外部表与内部表的转换
        alter table stu_ex set TBLPROPERTIES ('EXTERNAL' = 'TRUE');
9.数据的导出
    9.1 导出同时格式化(不加local则导出到hdfs)
        insert overwrite local directory '/opt/module/datas/student'
        row format delimited
        fields terminated by '\t'
        select * from student;
    9.2 hadoop命令导出到本地
        dfs -get /user/hive/warehouse/student/month=201709/000000_0 /opt/module/datas/export/student3.txt;
    9.3 shell命令导出
        hive -f/-e 执行语句或者脚本 > file    -- -f跟文件,-e跟执行语句
    9.4 export仅可以导出到hdfs,常用于hdfs集群hive表迁徙
        export table default.student to '/user/hive/warehouse/export/student'; -- 同时会导出表的元数据
10.数据的导入(仅能导入export导出的数据,因为需要获取表的元数据)
    import table table_name from 'export导出数据的路径';
11.清除表中数据
    truncate table student; -- 只能删除管理表,不能删除外部表中数据
12.Like、RLike:RLike可以使用java的正则表达式
13.group by及having的使用 -- hive中对于使用group by后查询字段仅限group by的字段及聚合函数
    select deptno, avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;
14.mapreduce的join    
    14.1 mapreduce中的reducejoin特点:在mapper阶段进行数据关联标记,在reducer阶段进行数据聚合
    14.2 mapreduce中的mapjoin特点:将小表加载到内存中,在mapper阶段根据内存中的数据对大表进行数据处理,没有reduce阶段
15.HQL的join
    15.1 仅支持等值连接不支持非等值连接
        例:不支持select * from A left join B on A.id != B.id;
    15.2 不支持在on条件中使用‘or’
    15.3 每个join都会启动一个mapreduce任务,但hive默认开启mapreduce优化
        关闭mapreduce优化:set hive.auto.convert.join=false;
16.order by
    会进行全局排序,则reduce数量被看作1个,效率低下
17.sort by -- 局部排序
    对于每个mapreduce各分区进行局部排序,分区中的数据随机给定
18.distribute by
    18.1 即mapreduce中自定义分区操作,hql书写规则:先分区后排序  
    18.2 distribute by的分区规则是根据分区字段的hash码与reduce的个数进行模除后,余数相同的分到一个区。
19.cluster by
    当distribute和sort字段相同时可用cluster进行替代,默认正序,但不支持desc倒序
20.分桶 -- 分桶表的数据需要通过子查询的方式导入
    20.1 开启分桶的设置
        set hive.enforce.bucketing=true;
    20.2 分桶表的创建
        create table stu_buck(id int, name string)
        clustered by(id) 
        into 4 buckets
        row format delimited fields terminated by '\t';
    20.3 分桶的规则
        用分桶字段的hash值与桶的个数求余,来决定数据存放在那个桶,
    20.4 分桶与分区区别
        a. 分桶结果在表的目录下存在多个分桶文件
        b. 分区是将数据存放在表所在目录不同文件路径下
        c. 分区针对是数据存储路径,分桶针对的是数据文件,分桶可以在分区的基础粒度细化
21.分桶的抽样    
    21.1 抽样语法 -- 必须 x<=y
        select * from table_name tablesample(bucket x out of y on bucketKey); -- on bucketKey可不写
    21.2 抽样规则
        a. y用来决定抽样比例,必须为bucket数的倍数或者因子,
            例:bucket数为4时,当y=2时,4/2=2,则抽取两个桶的数据,具体抽取哪个桶由x决定
        b. x用来决定抽取哪个桶中的数据
            例1:当bucket=4, y=4, x=2时,则需要抽取的数据量为bucket/y=1个桶,抽取第x桶的数据
            例2:当bucket=4, y=2, x=2时,则需要抽取的数据量为bucket/y=2个桶,抽取第x桶和第x+y桶的数据
            例3:当bucket=12, y=3, x=2时,抽bucket/y=4个桶,抽取第x桶和第x+2y桶的数据
22.NVL函数
    NVL(column_name, default_cvalue),如果该行字段值为null,则返回default_value的值
23.CONCAT_WS()函数
    使用规则:concat_ws(separator, [string | array(string)]+)
    例:select concat_ws('_', 'www', array('achong','com')) 拼接结果:www_achong_com
24.COLLECT_SET(col)函数
    使用规则:仅接受基本数据类型,将字段去重汇总,并返回array类型
    例(行转列):表结构
            name    xingzuo           blood
            孙悟空      白羊座            A
            大海      射手座            A
            宋宋      白羊座            B
            猪八戒      白羊座            A
            凤姐      射手座            A
        需求:把星座和血型一样的人归类到一起
            射手座,A            大海|凤姐
            白羊座,A            孙悟空|猪八戒
            白羊座,B            宋宋
        查询语句:
            SELECT CONCAT_WS(',', xingzuo, blood), CONCAT_WS('|', COLLECT_SET(NAME))
            FROM xingzuo
            GROUP BY xingzuo, blood
25.EXPLODE(爆炸函数)及LATERAL_VIEW)(侧写函数)
    25.1 explode:将列中的array或者map结构拆分成多行 -- 一般需结合lateral_view使用
    25.2 lateral_view: LATERAL VIEW udtf(expression) 表别名 AS 列别名
    例(行转列)
        select movie, category_name
        from  movie_info 
        lateral view explode(category) table_tmp as category_name;
26.开窗函数 -- 常结合聚合函数使用,解决即需要聚合前的数据又需要聚合后的数据展示
    26.1 语法:UDAF() over (PARTITION By col1,col2 order by col3 窗口子句(rows between .. and ..)) AS 列别名
            (partition by .. order by)可替换为(distribute by .. sort by ..)
    26.2 over(): 指定分析数据窗口大小
    26.3 窗口子句 -- 先分区在排序然后接rows限定执行窗口
        26.3.01 n PRECEDING:往前n行数据
        26.3.02 n FOLLOWING:往后n行数据
            例:select name, orderdate, cost, sum(cost) over(
                                                                partition by name 
                                                                order by orderdate 
                                                                rows between 1 PRECEDING and 1 FOLLOWING
                                                            ) from business;
        26.3.03 CURRENT ROW:当前行
        26.3.04 UNBOUNDED PRECEDING 表示从前面的起点
        26.3.05 UNBOUNDED FOLLOWING表示到后面的终点
            例:select name, orderdate, cost, sum(cost) over(
                                                                partition by name 
                                                                order by orderdate 
                                                                rows between CURRENT ROW and UNBOUNDED FOLLOWING
                                                            ) from business;
27.LAG(col,n,default_val):往前第n行数据
28.LEAD(col,n, default_val):往后第n行数据
    例:select name, orderdate, cost, lag(orderdate, 1, 'null') over(partition by name order by orderdate)
        from business; -- 即获取前1行的orderDate数据
29.ntile(n):把有序分区中的行分为n组,每组编号从1开始 -- 分组规则详见:ntile的分组规则.sql
    例:select name,orderdate,cost, ntile(5) over(order by orderdate) num from business
30.Rank函数
    rank() 出现相同排序时,总数不变
    dense_rank() 出现相同排序时,总数减少
    row_number() 不会出现相同排序


sql执行顺序
    from... where...group by... having.... select ... order by...
    
hql执行顺序    
    from … where … group by … having … select … order by … 或
    from … on … join … where … group by … having … select … distinct … order by … limit
    存在开窗函数时,起码在order by之前执行

    
例题1:-- 集合类型数据导入
    {
        "name": "songsong",
        "friends": ["bingbing" , "lili"] ,       //列表Array, 
        "children": {                      //键值Map,
            "xiao song": 18 ,
            "xiaoxiao song": 19
        }
        "address": {                      //结构Struct,
            "street": "hui long guan" ,
            "city": "beijing" 
        }
    }

    基于上述数据结构,我们在Hive里创建对应的表,并导入数据。
    1.1 格式化数据为:
        songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing
        yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing
    1.2 建表语句:
        create table test(name string, 
        friends array<string>,
        children map<string, int>,
        address struct<street:string, city:string>)
        row format delimited
        fields terminated by ','
        collection items terminated by '_'
        map keys terminated by ':';
    1.3 数据写入语句
        load data local inpath '/opt/module/datas/test.txt' into table test;
    1.4 查询语句
        select friends[0] friend,children['xiao song'] age,address.city from test where name = 'songsong';

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值