内部表在HDFS上默认的存储路径
hdfs://IP:8020/user/hive/warehouse/数据库名.db/表名
内部表的创建
create table student (
sno int,
sname string,
sex string,
sage int,
sdept string
) row formatdelimited fields terminated by ',' ;
将文件上传到HDFS
hadoop fs -put student.txt /user/hive/warehouse/student --上传文件
外部表的创建
create external table student_ext (
sno int,
sname string,
sex string,
sage int,
sdept string
) row formatdelimited fields terminated by ',' location '/stu' ;
将文件上传到HDFS
hadoop fs -mkdir /stu --创建外部表文件夹
hadoop fs -put student.txt /stu --上传文件
说明:
/stu是存放映射文件的文件夹
以上两种(未涉及到分区),可以直接将文件使用put
命令上传到HDFS即可(但是:必须先建表,再上传文件,若先上传文件,再建表,则不会映射)。但是官方不推荐,官方推荐使用load语句
分区表的创建
分区字段
在HDFS中是以文件夹
的形式存在的,该文件夹下放的是分区的文件。分区字段是虚拟字段
,不会在实际存放的文件中体现的。只是用来加载数据时候的指定- 分区字段
不能
是表中已经存在的字段(因为查询的时候,分区字段会显示出来,一个表中不能出现两个相同的字段),而且分区表需要load来加载
create table t_user_p (
id int,
name string,
country string
) partitioned by (guojia string)
row format delimited fields terminated by ",";
- 使用
load
命令进行数据加载,加载的时候指定分区的信息(local
本地:指的是hive服务器所在的Linux系统) local
命令,指的是从本地加载。如果是从HDFS中加载,可以不用local命令- 从本地加载(
load
)的时候,实质是复制操作,将本地的文件复制到Hive的默认路径下。从HDFS加载(load
)的时候,实质是移动命令,将原来HDFS目录中的文件移动到Hive的默认路径下
# 加载分区 guojia='zhongguo'
load data local inpath
'/root/hivedata/china.txt'
into
table t_user_p partition(guojia='zhongguo');
# 加载分区 guojia='meiguo'
load data local inpath
'/root/hivedata/usa.txt'
into
table t_user_p partition(guojia='meiguo');
注:以上所有的加载方式中,数据文件中没有字段名。即从第一行就是数据