hive的dml部分小结

导入数据中,导入linux系统上的数据是进行文件复制,导入hdfs上的数据是进行文件移动。也就是说在hdfs上进行数据的导入后,原位置的文件不存在。命令如下:

load data [local] inpath 'filepath' [overwrite] into table tablename。

使用local关键字来区分是从linux系统还是从hdfs上获取数据。

注意:其实当不指定local的时候,数据来源是根据hadoop的fs.defaultFS和hive的hive.metastore,warehouse.dir来定义的,当然也可以指定路径的全部schema信息。

还有一种来源是hive表。

底层是使用mapreduce程序进行数据的导入操作的。命令如下:

insert (overwrite|into) table tablename1 select_statement1 from from_statement where_statement;

使用overwrite和into的区别在于,overwrite是进行重写操作,也就是说会将原始数据进行删除。into是进行添加操作,原始数据不会进行删除。

注意:当我们将from语句提到最前面的时候,我们可以进行多表插入。


create table classes(classid int comment 'this is classid, not null', classname string comment 'this is class name') row format delimited fields terminated by ',';

create table students(studentid int comment 'this is studentid, not null', classid int comment 'this is student class id, can set to null', studentname string) row format delimited fields terminated by ',';

// 从linux下导入数据

load data local inpath '/home/hadoop/datas/13/classes.txt' into table classes;

load data local inpath '/home/hadoop/datas/13/students.txt' into table students;


// 从hdfs上导入数据

load data inpath '/user/13/students.txt' into table students;

dfs -put /home/hadoop/datas/13/students.txt /user/13/

load data inpath '/user/13/students.txt' overwrite into table students;


'from students insert into table test1 select studentid insert overwrite table test2 select distinct classid where classid is not null;//多表插入


select:

from students select *;

CTE语句,Common Table Expression(CTE)主要作用是保存临时结果,作为查询语句的公用部分,方便后面的select查询中重复使用。

//获取班级号为1的学生的信息:

with tmp as ( select studentid as sid, classid as cid, studentname as name from students where studentid=1) from tmp select *;


order/sort by 语句主要用于hive中的数据排序,这两个命令的使用方式都类似sql语法中的order by。两者的主要区别是:sort by 保证单reducer有序,order by保证全局有序,也就是说当reducer个数为多个的时候,是用sort by 可能出现局部有序的情况。另外对于order by操作,有一个小的限制,就是当hive.mapred.mode模式为strict的时候,在order by语句后面必须跟着limit语句。


// 使用order by根据学生id倒序。

select * from students order by studentid desc;

// 获取学生数大于3的班级id

from students select classid where classid is not null group by classid having count(studentid) > 3;


你可能感兴趣的:(hive)