hive导入数据
hive中创建表之后如何给表中添加数据呢,其实是有很多种方式的
使用hdfs
首先由于hive的数据是在hdfs存储的,所以其实是可以直接使用hdfs来将文件上传到对应表的目录下,此时表中就存在数据了
建表
1 2 3 4 5 6
| create table if not exists dept( deptno int, dname string ) row format delimited fields terminated by '\t';
|
使用desc formatted dept来找到该表所对应的hdfs存储位置为hdfs://localhost:9000/user/hive/warehouse/study_hive.db/dept
此时使用hdfs来将数据文件上传到该目录下
1
| hdfs dfs -put ./dept.txt /user/hive/warehouse/study_hive.db/dept
|
查询数据
1 2 3 4 5
| hive (study_hive)> select * from dept; OK dept.deptno dept.dname 1 财务 2 IT
|
划重点
由于该数据是直接通过hdfs上传上去的,该数据没有经过hive插入,所以在hive的元数据中并不知道该表中的数据情况,来看一下元数据情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| select TBL_ID from TBLS where TBL_NAME = 'dept'; + | TBL_ID | + | 3 | +
select * from TABLE_PARAMS where TBL_ID = 3; + | TBL_ID | PARAM_KEY | PARAM_VALUE | + | 3 | COLUMN_STATS_ACCURATE | {"BASIC_STATS":"true","COLUMN_STATS":{"ame":"true","o":"true"}} | | 3 | bucketing_version | 2 | | 3 | last_modified_by | zhanghe | | 3 | last_modified_time | 1618134450 | | 3 | numFiles | 0 | | 3 | numRows | 0 | | 3 | rawDataSize | 0 | | 3 | totalSize | 0 | | 3 | transient_lastDdlTime | 1618134450 | +
|
可以看到此时该表的numFiles(文件数量)、numRows(行数量)都是0,因为hive并不知晓其有多少数据。
使用hive load数据
1 2 3 4 5
|
load data local inpath '/Users/zhanghe/Desktop/user/myself/hive_data/dept1.txt' into table dept;
|
查看此时的数据变化
1 2 3 4 5 6 7
| select * from dept; OK dept.deptno dept.dname 1 财务 2 IT 1001 产品 1002 测试
|
元数据变化
1 2 3 4 5 6 7 8 9 10 11 12 13
| select * from TABLE_PARAMS where TBL_ID = 3; + | TBL_ID | PARAM_KEY | PARAM_VALUE | + | 3 | bucketing_version | 2 | | 3 | last_modified_by | zhanghe | | 3 | last_modified_time | 1618134450 | | 3 | numFiles | 2 | | 3 | numRows | 0 | | 3 | rawDataSize | 0 | | 3 | totalSize | 44 | | 3 | transient_lastDdlTime | 1618135089 | +
|
发现此时的numFiles已经变了,而且还将之前上传到hdfs的文件也算进来了,变成了2,而此时numRows还是0,说明load data上传文件时hive是可以知道上传了多少文件,但是并不知道文件中有多少数据的
- [ ] 为什么会将之前上传到hdfs的文件计算进来呢???
使用hive insert数据
1 2 3 4 5
|
insert into table dept values(201,'人事'),(202,'公关'); 或者 insert overwrite table dept values(201,'人事'),(202,'公关');
|