1.加载本地数据:
创建一个文件夹,将来把所有的数据,都放在这个文件下:
mkdir /home/hivedata
创建一个文件 user.txt
添加如下数据:
1,宝总
2,李李
3,小汪
4,爷叔
先有数据,根据数据的格式,和字段数量以及类型,创建一个表:
create table t_user(
id int,
name string
)
row format delimited
fields terminated by ','
lines terminated by '\n'
stored as textfile;
加载本地数据:
load data local inpath "/home/hivedata/user.txt" into table t_user;
查看数据是否加载成功:
select * from t_user limit 10;

你能够看到里面的数据,并且没有乱码,原因是stored as textfile
2.从HDFS加载到Hive中:
hdfs dfs -put /home/hivedata/user.txt /home

将hdfs的数据导入到t_user 表中:
load data inpath '/home/user.txt' into table t_user;
就比之前少了一个 local 关键字。

查看hdfs上的user.txt 发现不见了,去哪里了,被移动走了!


思考一下:为什么是移动,而不是复制?
因为hdfs上的数据,默认都以为比较大,所以如果相同的数据占2份,非常的消耗空间。
查看数据,发现有两份,想覆盖怎么办?
load data local inpath '/home/hivedata/user.txt' overwrite into table t_user;
3.将数据直接放入表对应的文件夹下
再思考一个问题:既然hive中的数据是在hdfs上的,我们也可以手动的上传数据,能上传至/home,为何不能上传至:/user/hive/warehouse/yhdb.db/t_user
[root@bigdata01 hivedata]# cp user.txt user2.txt
[root@bigdata01 hivedata]# hdfs dfs -put /home/hivedata/user2.txt /user/hive/warehouse/yhdb.db/t_user
hive中的数据,不要load 也可以被正常使用。
4.从其他表中加载数据
语法格式:
insert into table tableName2 select [.....] from tableName1;
扩展内容:向多张表中插入数据的语法
from tableName1
insert into tableName2 select * where 条件
insert into tableName3 select * where 条件
实战:
insert into table t_user2 select * from t_user;
这个sql的前提条件是:必须先创建一个t_user2
快速创建一个同样的表,只要表结构:
create table t_user2 like t_user;
创建完之后再运行
insert into table t_user2 select * from t_user;
创建t_user3和 4
create table t_user5 like t_user;
create table t_user4 like t_user;
from t_user2
insert into t_user4 select *
insert into t_user5 select id,name;
5.克隆表数据
- create table if not exists tableName2 as select [....] from tableName1;
- create table if not exists tableName2 like tableName1 location 'tableName1的存储目录的路径'
# 新表不会产生自己的表目录,因为用的是别的表的路径
扩展内容:只复制表结构
create table if not exists tableName2 like tableName1;
实战:
create table t_user6 as select * from t_user2;
create table t_user7 like t_user2 location '/user/hive/warehouse/hive02.db/t_user2';
348

被折叠的 条评论
为什么被折叠?



