美奇科技 发表于 2017-12-17 19:32:42

从零自学Hadoop(25):Impala相关操作下


一:INSERT VALUES
  该方式不适合载入大量的数据到基于 HDFS (HDFS-based)的表,因为插入操作无法并行,并且每一个语句会产生单独的数据文件,形成很多小文件。
  不要运行每次只插入单行数据的 很多条的 INSERT ... VALUES 语句的脚本,会产生很多小文件。将数据都放在VALUES中会好很多,就没有那多的小文件。
  

insert into student values ('1','张三','男','2017-10-23 10:10:20'), ('2','李四','男','2017-10-23 10:10:20'), ('3','王五','男','2017-10-23 10:10:20');  

insert into student values ('4','张三1','男','2017-10-23 10:10:20'), ('5','李四1','男','2017-10-23 10:10:20'), ('6','王五1','男','2017-10-23 10:10:20');  

  使用insert into table 语法,每一组新插入的数据,都会追加到原来的数据后。 
 


  我们可以看到hdfs中有两个文件。也就是说insert一次就生成一个文件,所以会产生很多小文件。

  使用insert overwrite table 语法,每一组新插入的数据,都会覆盖表中原有的数据。
  

insert overwrite student values ('7','张三2','男','2017-10-23 10:10:20'), ('8','李四2','男','2017-10-23 10:10:20'), ('9','王五2','男','2017-10-23 10:10:20');  



二:LOAD DATA语句
  LOAD DATA 语句简化了 Impala 内部表从 HDFS 位置移动一个或目录下所有数据文件到该表对应的 Impala 数据目录中的 ETL 过程。
  新建待导入文件数据 student.txt

  从本地上传到hdfs
  

sudo -u impala hdfs dfs -put student.txt /tmp/student.txt  

  查看
  

hadoop fs -ls /tmp/  


  导入
  

load data inpath '/tmp/student.txt' into table student ;  




  可以看到文件的内容导入到了表中,
  并且对应的hdfs目录的文件已经不再了。
  重新将文件上传到对应目录
  然后重新导入
  这次我们使用overwrite
  

load data inpath '/tmp/student.txt' overwrite into table student ;  


  可以看到数据已经加载进去,并且原有的数据都被替换掉了。

三:分区表的load data
  新增分区
  

alter table student_padd partition (year='2017',month='01',day='01');  

alter table student_padd partition (year='2017',month='01',day='02');  


  

load data inpath '/tmp/student.txt' overwrite into table student_ppartition(year='2017',month='01',day='01') ;  

load data inpath '/tmp/student.txt' overwrite into table student_ppartition(year='2017',month='01',day='02') ;  

  这之间还需要再将文件上传到hdfs

  

select * from student_p;  


  可见指定了分区后,不会影响到其他分区的数据。

页: [1]
查看完整版本: 从零自学Hadoop(25):Impala相关操作下