• Hive语法小释


    阅读本文你可以获取:

     1.数据库的查询

     2.hive表的基本操作(建表三种常用方式、删除表、修改表、加载数据、内外表转换、添加分区、复制数据)

     3.SQL到HiveQL的的一些不同点

    1.   基本操作

    --查询数据库
    Show databases;
    --筛选数据库:
    Show databases like 'h.*';
    --修改数据库指定位置:
    Create database test_database Location '/my/file';
    
    --显示数据库文件所在目录语句:
    Describe database test_database;
    --删除数据库:
    Drop database if exist test_database cascade;--hive 不允许用户删除一个包含有表的数据库,所以可在最后加cascade即级联删除。
    --显示具体表的信息:
    Describe extended/formatted(扩展/格式化) test_database.test;--实际情况用formatted更多,可读性更强
    --查看表分区:
    Show partitions table ;
    Show partitions table partitons(column ='分区名');--查看指定分区
    
    --基本表操作
    
    --建表语句示例:                                                              
    --hive创建表主要有三种方式,                                                 
    --第一种直接使用create table命令,                                           
    --第二种使用create table ... as select...(会产生数据)。                      
    --第三种使用create table tablename like exist_tablename命令。不会拷贝数据
    use rpt;
    drop table if exists test;
    create external table test(--external建立外部表,如果建内部表则不加此关键字
        testid                        string                comment '分流id',    
        group_id                    string                 comment    '用户组id'
    )comment '测试表'
    partitioned by (ds string)
    stored as orc;
    
    --表添加注释:
    Create database test_database comment 'This is a test database!';
    
    --删除表:
    DROP TABLE test1;
    
    --修改表结构:
    DESC student1;--查看表结构
    ALTER TABLE student1 ADD COLUMNS (address STRING,grade STRING);
    
    --修改表名:
    ALTER TABLE student1 RENAME TO student3;
    
    --创建和已知表相同结构的表:
    CREATE TABLE copy_student1 LIKE student1;
    
    --导入外部文件数据:
    --加载数据到student1表中
    LOAD DATA LOCAL INPATH '/home/hadoop/data/student1.txt' INTO TABLE student1;
    
    --加载hdfs中的文件:
    LOAD DATA INPATH '/user/hive/student1.txt' INTO TABLE copy_student1;
    
    --修改列名:
    alter table tablename change column c_Old c_New int comment 'XXXXXX' after 某列;--某列之后
    来自 <https://blog.csdn.net/scgaliguodong123_/article/details/46941419> 
    
    --增加列:
    Alter table tablename add columns (
    Id int comment'id',
    Name string comment 'name' 
    )
    
    --删除或者替换列:(会替换表中所有列)
    Alter table tablename replace columns
    (
    Id int,
    Name string
    );
    
    
    --内部表转外部表
    alter table tablename set TBLPROPERTIES ('EXTERNAL' = 'TRUE');
    --外部表转内部表
    alter table table_name set TBLPROPERTIES('EXTERNAL'='FALSE');
    来自 <https://blog.csdn.net/scgaliguodong123_/article/details/46941419> 
    
    --添加/删除分区语句
    Alter table test add partition(ds='2018-06-02')--已有分区的表
    alter table test drop if exist partition(ds='2018-06-01') ;--删除表分区
    
    --复制表数据:
    INSERT OVERWRITE TABLE copy_student2 SELECT * FROM student1;
    
    --多表同时复制:
    hive> FROM student1                                       
        > INSERT OVERWRITE TABLE copy_student3
        > SELECT *                            
        > INSERT OVERWRITE TABLE copy_student4
        > SELECT *;

    2.SQLHiveQL的转换

    来自 <https://blog.csdn.net/hguisu/article/details/7256833> 

    1、Hive不支持等值连接 

     SQL中对两表内联可以写成:

    select * from dual a,dual b where a.key = b.key;
    Hive中应为
    select * from dual a join dual b on a.key = b.key; 
    而不是传统的格式:
    SELECT t1.a1 as c1, t2.b1 as c2FROM t1, t2
     WHERE t1.a2 = t2.b2

    2、分号字符

    分号是SQL语句结束标记,在HiveQL中也是,但是在HiveQL中,对分号的识别没有那么智慧,例如:
    select concat(key,concat(';',key)) from dual;
    但HiveQL在解析语句时提示:
           FAILED: Parse Error: line 0:-1 mismatched input '<EOF>' expecting ) in function specification
    解决的办法是,使用分号的八进制的ASCII码进行转义,那么上述语句应写成:
    select concat(key,concat('73',key)) from dual;

    3、IS [NOT] NULL

    SQL中null代表空值, 值得警惕的是, 在HiveQL中String类型的字段若是空(empty)字符串, 即长度为0, 那么对它进行IS NULL的判断结果是False.

    4、Hive不支持将数据插入现有的表或分区中,仅支持覆盖重写整个表,示例如下:

    INSERT OVERWRITE TABLE t1
    SELECT * FROM t2;

    5.hive不支持INSERT INTO, UPDATE, DELETE操作

    其中 INSERT INTO syntax is only available starting in version 0.8。

    INSERT INTO就是在表或分区中追加数据。

  • 相关阅读:
    Django的日志操作,记录一下自己的使用
    初学jupyter 与爬虫
    mysql的库名或者表名带空格不能删除的问题
    Linux的vim命令的快捷键
    DjangoORM相关(多表操作)
    DjangoORM相关(单表操作)
    Django模板
    Django URL相关
    Monkeyrunner学习记录之运行模拟器
    Monkeyrunner学习记录之环境搭建
  • 原文地址:https://www.cnblogs.com/littlewu/p/9242049.html
Copyright © 2020-2023  润新知