Hive DML

Hive是构建在Hadoop之上的数据仓库
DML : Data Manipulation Language (数据管理语言)

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

创建ruoze_dept表

create table ruoze_dept(
deptno int,
dname string,
loc string
)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

LOAD DATA LOCAL INPATH '/home/hadoop/data/dept.txt' INTO TABLE ruoze_dept;
LOAD DATA INPATH '/data/dept.txt' INTO TABLE ruoze_dept;(注:把hdfs文件系统里面的文档加载到hive下面的表里面,是不带local的!而且这个操作属于移动,相当于/data文件夹下面的dept.txt文件被移走到hive下面的ruoze_dept表中!!!)

hive (default)> load data local inpath '/home/hadoop/data/dept.txt' overwrite into table ruoze_dept;(加上overwrite就会先把ruoze_dept中的内容清空,再把/home/hadoop/data/dept.txt中内容放到ruoze_dept中去。不加overwrite就是在ruoze_dept中追加内容)
Standard syntax: (标准的语法):
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;
hive (default)> create table ruoze_emp_test as select *from ruoze_emp; (创建ruoze_emp_test表并把ruoze_emp的内容复制到ruoze_emp_test中)
INSERT OVERWRITE TABLE ruoze_emp_test select empno,ename from ruoze_emp; (报错如下:)
FAILED: SemanticException [Error 10044]: Line 1:23 Cannot insert into target table because column number/types are different 'ruoze_emp_test': Table insclause-0 has 8 columns, but query has 2 columns.(ruoze_emp_test中有8列,而我们只插入两列,会报错)

注:INSERT OVERWRITE TABLE ruoze_emp_test 
select empno,job,ename,mgr,hiredate,sal,comm,deptno from ruoze_emp; (数据都一样了,都是8列,但是不小心把job,ename的前后列的位置颠倒了,发现此时是可以成功运行的,但是此时列的位置已经交换了,但是却没有报错,这种在公司里很致命,因为出来的数据就可能乱了!!)

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ruoze' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' SELECT empno,ename FROM ruoze_emp;(把ruoze_emp中的empno,ename传到/tmp/ruoze文件夹下。如下可以查看验证)(加上LOCAL就是传到本地,不加的话就是传到hdfs文件系统下)
[hadoop@hadoop001 ruoze]$ pwd
/tmp/ruoze
[hadoop@hadoop001 ruoze]$ ll
-rw-r--r--. 1 hadoop hadoop 164 Nov  8 10:53 000000_0
[hadoop@hadoop001 ruoze]$ more 000000_0
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES

注:hive报错信息提醒无法连接hadoop的9000端口,简单说就是无法连接hdfs,无法访问hdfs。就jps看下进程是不是hadoop已经起来了。它提示不能连接,一般都是hadoop挂了,你就要去检查一下,他是不是正常的。

hive (default)> select empno,ename from ruoze_emp where deptno=10;
hive (default)> select * from ruoze_emp where sal between 800 and 1600;(查询ruoze_emp中工资在800到1600之间的人的信息。属于800到1600之间的闭区间)
hive (default)> select * from ruoze_emp where sal between 800 and 1600 limit 5;(限制只查5条数据)
hive (default)> select * from ruoze_emp where ename in ("SMITH","ALLEN" );(查看名字在SMITH和ALLEN之间的人的信息)
hive (default)> select * from ruoze_emp where ename not in ("SMITH","ALLEN" );(查看名字不在SMITH和ALLEN之间的人的信息)
hive (default)> select * from ruoze_emp where comm is null;(查看津贴为空的人的信息,对应的不为空就是is not null。注:null和0不等价!!!)
hive (default)> select * from ruoze_emp where comm is not null and comm != 0.0;(过滤掉津贴为空和为0.0的人)

猜你喜欢

转载自blog.csdn.net/qq_42694416/article/details/84316764