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.SQL到HiveQL的转换
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('\073',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就是在表或分区中追加数据。
--表添加注释: Create database test_database comment 'This is a test database!';