HIVE DDL,
1.何为DDL?
DDL: Data Definition Language
create drop alter关键字开头的
2.hive的抽象
3.关于数据库存放位置和参数查询
开局自带一个default数据库,默认数据库存放位置:/user/hive/warehouse,位置是由参数决定的:hive.metastore.warehouse.dir
Hive所有参数的查询:https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties
想要查询参数设置情况,请用set:
hive (default)> set hive.metastore.warehouse.dir
> ;
hive.metastore.warehouse.dir=/user/hive/warehouse
也可以用set修改:
set key=value;
4.关于创建db
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
这里 | 表示2选1,[]是可选条件,comment是备注信息,with是创建的属性信息。
想要查看db信息
desc database extended xxx
db信息属性也可修改
ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, ...); -- (Note: SCHEMA added in Hive 0.14.0)
ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role; -- (Note: Hive 0.13.0 and later; SCHEMA added in Hive 0.14.0)
ALTER (DATABASE|SCHEMA) database_name SET LOCATION hdfs_path; -- (Note: Hive 2.2.1, 2.4.0 and later)
删除数据库
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
这里的cascade: ,1对多的时候,你删除1的一端是否删除多的一端,如果数据库有表,会报错,用这个参数直接全删,生产不用,危险。
5.hive数据类型
重要数值类型:int bigint float double
字符串: string <= date time date time类型麻烦不好用,直接用string类型
t:date time - string 比如日志里如果打印出来是时间戳,看不懂啊
where flag=true 0 布尔类型用0,1更好,更短,不用true,false
6.hive分割符
Hive构建在Hadoop之上
hive创建表,然后数据是存储在HDFS之上
文件:zhangsan,20,m,beijing
表: name age gender location
文件和表要对应
所以创建表的时候要指定分隔符(默认分隔符是\001 ^A)
我们要用空格、制表符(\t)
7.创建表及重点
1.表分为内部表(MANAGED_TABLE)和外部表,区别在于内部表是hive管理的。如何理解,删除一张内部表,hdfs,mysql的该表数据都被删除。然而删除一张外部表,hdfs的数据还在,mysql的元数据被删除了。
2.查看表结构
表头信息desc xxx
还可以看到细节,存在哪 desc extended xxx
细节格式工整,工作用这个
desc formatted ruoze_emp;
3.复制表
拷贝表结构,不考数据
create table ruoze_emp2 like ruoze_emp;
都考,涉及mapreduce,慢
create table ruoze_emp3 as select * from ruoze_emp;
4.创建表语法
CREATE EXTERNAL(加了是外部,不加默认内部) TABLE ruoze_emp_external (
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 字段间分割符
#LINES TERMINATED BY '\n' 行之间的分割符,默认换行
LOCATION '/ruoze_emp_external' 外部表常用,hdfs根路径,该路径下直接放数据文件,可以直接select出来
;
5.给表导数
load data local inpath '/home/hadoop/app/hive-1.1.0-cdh5.7.0/data/emp.txt' overwrite into table ruoze_emp;
这里local表示本地数据,也就是linux,不加就相当于hdfs上的数据
overwrite加上表示重写,原先数据会被替换,不加是追加。
注意如果表和数据分割符不对应,数据会变为null
6.删表
drop table ruoze_emp4;
7.内部导数注意
先上传个文件到hdfs
hadoop fs -put dept.txt /data/
hadoop fs -ls /data,在/data目录下有dept.txt
然后执行下面这句两次
LOAD DATA INPATH '/data/dept.txt' INTO TABLE ruoze_dept;
报错发现/data下面没有dept.txt了,因为是内部表,第一次导入,depy.txt被移动到了ruoze_dept目录下面了。
8.从其它表导入数据
两张表注意导入的表和导入数据列数要一样,数据类型一样
INSERT OVERWRITE TABLE ruoze_emp_test select empno,ename from ruoze_emp;
9.把数据写进文件系统
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ruoze'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
SELECT empno,ename FROM ruoze_emp;