表中的字段类型
1.数值类型:int bigint float double
2.字符串: string <= date time (date time类型就用string型表示)如:20181020
3.布尔类型:false和true(有时候用于节省空间,不需要用布尔类型值,就用0和1代替false和true)
表的创建
eg:文件:zhangsan,20,m,beijing
表: name age gender location
创建表的时候要指定分隔符(默认分隔符是\001 ^A)工作中常用的有两种:空格、制表符(\t)
举例如下:
CREATE TABLE ruoze_emp_2 (
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' ;(hive 里面行之间的分隔符默认就是'\n',所以LINES TERMINATED BY '\n'可以不用写。上面创建的为员工表,依次为员工编号、员工姓名、工作岗位、上司编号、入职时间、薪资、补贴、部门编号。以后如果创建表规定的分隔符和文档中的分隔符不一样,那么导入表中的数据就是全为NULL值)
hive (default)> create table ruoze_emp2 like ruoze_emp;(创建ruoze_emp2表,用ruoze_emp表的结构,但是不用表里面的内容)
hive (default)> create table ruoze_emp3 as select * from ruoze_emp;(把ruoze_emp表里面的内容全部拷贝到新建的ruoze_emp3表中。这时候涉及到拷贝,是在yarn上运行的map reduce作业)
load data local inpath '/home/hadoop/data/emp.txt' overwrite into table ruoze_emp; (把文档中的信息传入表中)
hive (default)> drop table ruoze_emp_2;(删除ruoze_emp_2表)
查看表结构:
hive (default)> desc ruoze_emp;
empno int
ename string
job string
mgr int
hiredate string
sal double
comm double
deptno int
hive (default)> desc extended ruoze_emp;(查看ruoze_emp表的结构,及其存储地址所属数据库等详细信息。但是信息都堆积在一起)
hive (default)> desc formatted ruoze_emp;(查看ruoze_emp表的结构,及其存储地址所属数据库等详细信息。信息都很好的按照一定格式列出。这种查表结构的方法才是公司中所用的!!!)
修改表:
hive (default)> alter table ruoze_emp3 rename to ruoze_emp4; (把ruoze_emp3的表名字改为ruoze_emp4)
内部表与外部表
在desc formatted ruoze_emp命令下能看到Table Type:MANAGED_TABLE(MANAGED_TABLE参数代表内部表)
1.内部表的创建及其位置的存在情况如下:
create table ruoze_emp_managed as select * from ruoze_emp;(创建了一张内部表)
登录mysql,
mysql> use ruoze_d5;(切换到该数据库下,ruoze_d5是当时在hive.site.xml文件配置了的数据库。
mysql> show tables;(查看该数据库下的表)
mysql> select * from tbls \G;(查看tbls表中的信息,发现创建的内部表的信息在里面)
删除内部表:hive (default)> drop table ruoze_emp_managed;(hdfs上面的默认路径下面已经没有了该表,mysql下的ruoze_d5数据库下的tbls表中的信息也没有了该表的信息)
小结:创建了一张内部表:这表在HDFS和MySQL里面都有数据。删除内部表,hdfs上面的默认路径下面已经没有了该表,mysql下的ruoze_d5数据库下的tbls表中的信息也没有了该表的信息。
2.内部表的创建及其位置的存在情况如下:
在desc formatted ruoze_emp命令下能看到Table Type:EXTERNAL_TABLE (EXTERNAL_TABLE参数代表外部表)
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'
LOCATION '/ruoze_emp_external';(外部表一般情况下都是重新配置路径,而不是放在默认路径下面)
hive (default)> select * from ruoze_emp_external;(此时表中内容为空,因为只创建了表结构)
[hadoop@hadoop001 ~]$ cd data
[hadoop@hadoop001 data]$ hdfs dfs -put emp.txt /ruoze_emp_external(把本地的/data下面的emp.txt上传到hdfs下面的/ruoze_emp_external)
hive (default)> drop table ruoze_emp_external;(删除ruoze_emp_external表)
hive (default)> show tables;(查看发现已经没有ruoze_emp_external表)
[hadoop@hadoop001 data]$ hdfs dfs -ls /ruoze_emp_external
-rw-r--r-- 1 hadoop supergroup 700 2018-11-08 09:08 /ruoze_emp_external/emp.txt(虽然在hive中把表删除了,但是hdfs文件系统下的/ruoze_emp_external/emp.txt 表及其内容依然存在)
mysql> select * from tbls \G;(但是此时查看mysql里面的tbls表已经没有了ruoze_emp_external表的信息)
小结:创建内部表,在hive中删除时候会将其从hdfs以及mysql中都删除。而hive删除一张外部表时,hdfs文件系统下的表不会被删除,mysql下的表会被删除