hadoop,hive常用指令

hadoop-hdfs常用指令

1.安全模式常用操作命令:

hdfs dfsadmin -safemode leave //强制 NameNode 退出安全模式
hdfs dfsadmin -safemode enter //进入安全模式
hdfs dfsadmin -safemode get //查看安全模式状态
hdfs dfsadmin -safemode wait //等待,一直到安全模式结束

2.linux保证时间同步

ntpdate ‘时间服务器’ 如:ntpdate ntp1.aliyun.com

3.网页访问验证:

hdfs的网页: namenode主机名:50070
hadoop01:50070
yarn的网页:resourcemanager的主机名:8088
hadoop03:8088

4.单独启动某个进程

hdfs相关进程:
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode
yarn相关进程:
yarn-daemon.sh start resourcemanager
yarn-daemon.sh start nodemanager

5.linux运行jar包 指令

右键-export-jar.file-选择要打成jar包的文件
01 02 03 04 05 06
hadoop jar wc.jar mr01.Driver /words.txt /out02
#03代表上传的jar包名
#04代表主类的全限定名称
#05代表输入路径(对应主类输入路径的args(0)参数)
#06代表输出路径(对应主类输出路径的args(1)参数)

6、查看是否丢失数据的指令

hadoop fskc / 查看根目录下所有文件的健康状况,是否有损坏的数据块

hive常用命令

1.启动服务为后台进程

1).nohup hiveserver2 1>>/home/hadoop/hiveserver.log 2>>/home/hadoop/hiveserver.err &
2).nohup hiveserver2 1> /home/hdp01/lg.log 2>&1 &

2.创建表的格式

1.CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], …)]
[COMMENT table_comment] //指定的是表的描述信息
[PARTITIONED BY (col_name data_type [COMMENT col_comment], …)]//分区信息
[CLUSTERED BY (col_name, col_name, …)//分桶信息
[SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]

2.create table t_user(id string, name string) row format delimited fields terminated by ‘,’;

3.建表案例

建表案例:
hive中大小写不敏感的
95002,刘晨,女,19,IS
1.建一个普通的内部表
create table if not exists student(id int,name string,sex string,age int comment ‘19-23’,department string) comment ‘1805student’ row format delimited fields terminated by ‘,’ STORED as TEXTFILE LOCATION ‘/user/hive/testhive’;
2.建一个外部表
create external table if not exists student_external(id int,name string,sex string,age int comment ‘19-23’,department string) row format delimited fields terminated by ‘,’;
注意:没有一个表可以同时既是内部表又是外部表
3.建一个分区表 可以和内部表或外部表同时存在
分区字段作为过滤条件的时候,减少查询过程中的数据的扫描范围
create external table student_ptn(id int,name string,sex string,department string) PARTITIONED BY(age int COMMENT ‘partition ziduan’) row format delimited fields terminated by ‘,’;
添加分区:
alter table student_ptn add partition(age=17);
4.建一个分桶表
create EXTERNAL table student_buk(id int,name string,sex string,age int,department string) CLUSTERED by (name) SORTED by(age desc) into 3 BUCKETS row format delimited fields terminated by ‘,’;
SORTED by指定的是每一个桶中的排序规则
5.ctas建表
create table as select … from …
student:
load data inpath ‘/stuin’ into table student;
create table student_d20 as select * from student where age>20;
select * from student_d20;
6.表复制 like
只会复制表结构 不会进行表的数据的复制
create table stu_like like student;

4.删除数据库:

空数据库:drop database dbname;
删除包含表的数据库:drop database dbname cascade;
查看hive所有内置函数:show functions;
查看某一函数的具体使用方法:desc function extended functionname(如:desc function extended explode,查看爆裂函数使用方法);

5.Hive中内部表与外部表的区别:

1)创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。
2)删除表时:在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。

6.查看hive所有内置函数

show functions;

7.hive表的数据导入

1.load方式
load data [local] inpath ‘’ into table tablename;
local:本地数据加载
如果数据从本地加载 需要添加这个关键字
如果数据从hdfs进行加载则不需要添加这个关键字
从本地:
load data local inpath ‘/home/hadoop/apps/stu’ into table student01;
相当于将本地的文件 进行拷贝到student01表的hdfs的存储目录下
2.insert方式
1)insert into [table] name values();
2)单重数据插入 一次插入多条数据
insert into table tablename select … from … where …
insert into table stu_like01 select * from student01 where age=18; 扫描一次
insert into table stu_like01 select * from student01 where age=19; 扫描一次
insert into table stu_like01 select * from student01 where age=20; 扫描一次
3)多重数据插入
from tablename1
insert into table tablename select … where …
insert into table tablename select … where …
对原始数据表只扫描一次
分别插入数据到两个表中
from student01
insert into table stu_like01 select * where age=18
insert into table stu_like02 select * where age=20;

8.hive的数据导出

从hive表将数据导出到本地或hdfs
1)单重数据导出:
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement
local:将数据导出到本地
将student01表中的年龄小于19的数据导出到本地/home/hadoop/apps/stu_18
insert OVERWRITE local DIRECTORY ‘/home/hadoop/apps/stu_18’ select * from student01 where age<19;
2)多重数据导出
FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2] …
from student01
insert OVERWRITE local DIRECTORY ‘/home/hadoop/apps/stu_19’ select * where age=19
insert OVERWRITE local DIRECTORY ‘/home/hadoop/apps/stu_20’ select * where age=20;

9.hive中的半连接semi join

半连接:出现的意义是补充hive中一个语句的缺陷
判断左表中的关联的字段是否在右表中出现 如果出现则返回
left semi join 左半连接
select
*
from testa a left semi join testb b on a.id=b.id;
相当于内连接 只取左半表
在sql语句中有一个语法 in/exists 字段1 in (ziduan …)
在hive中多 对in、exits这种语法支持很薄弱 支持但是效率很低 原因就是key的不好确定 这个时候就出现了半连接

10.hive查询语句中的group by和常用的4个排序by

1.hive中的group by:

1)执行的顺序select语句之前 select后给的字段的别名是不可以使用的
student01 求每一个部门的年龄之和
select
department dept,sum(age) age
from student01 group by dept 错错错

select
department dept,sum(age) age
from student01 group by department; 正确的

2)如果hql语句中有group by 那么select后面只能跟两种内容
1)group by的字段
2)group by的聚合函数 sum count avg…
select
department dept,name,sum(age) age
from student01 group by department; 错的

2.常用4个排序by

order by:

hive中的排序 这个排序指的值对hive的表数据进行全排序
对hive表student01表 按照年龄排序 升序
select * from student01 order by age;

sort by:

局部排序 部分排序
只对每一个reducetask的输出结果进行排序
select * from student01 sort by age;
当reducetask只有一个的时候 相当于全局排序 这个时候和order by效果是一样得
设置reducetask个数:
set mapreduce.job.reduces=3
select * from student01 order by age;//仍然是全局排序
select * from student01 sort by age;
对于sort by 注意 reducetask的数据划分是随机取的一个列

distribute by:分桶 或 分组

类似于job.setNumReducetask()
不会进行排序,作用仅仅是分 将数据按照distribute by的字段进行分开 最终分成几部分取决于reducetask的个数 distribute by指定的仅仅是用于分的字段是哪一个 每一个reducetask中数据分规则:distribute by后面的字段%4
注意:distribute by后面的字段数值:distribute by后面的字段%4
distribute by后面的字段非数值:distribute by后面的字段。hashCode%4
set mapreduce.job.reduces=4;
select * from student01 distribute by age;
select * from student01 distribute by age sort by age;

cluster by

当distribute by和sort by的字段一样的时候=distribute by+sort by
先进行数据的分组:分组依据cluster by后面的字段
在每一个组进行排序,排序的规则cluster by后面的字段
select * from student01 cluster by age;
当distribute by+sort by的字段相同时可以用cluster by代替两者,但若两者by的字段不相同则不可以用cluster by替代的

11.hive中的数据类型相关知识

基本数据类型:int(tinyint,smallint,int,bigint)、float double、boolean、string、timestamp

复杂数据类型:有基本数据类型构成的
array:数组数据类型 指定数组的类型的时候一定给泛型<> 集合list set
map:映射 k-v
struct:类似于java中的对象类型
flowbean:手机号 上行流量 下行流量 总流量

array类型:

数据:
id name hobby
1 xh sing,movies,basketball
2 ls football,food
3 ww sleep,walk,food,chaojia
建表:
create table test_array(id int,name string,hobby array) row format delimited fields terminated by ‘\t’ collection items terminated by ‘,’;
collection items terminated by:指定的是集合的每个元素之间的分割符
数据加载:
load data local inpath ‘/home/hadoop/apps/test_array’ into table test_array;
数据查询:
通过下标进行数据访问
select hobby[0] from test_array;

map类型:指定泛型

数据:
id name piaofang
1 luhan paonan:1000,dadianying:100
2 hunagbo yichuhaoxi:10000,shansheng:20000,taijun:250000
3 xuzheng yaoshen:350000,zhubajie:60000

建表:
注意:建表时候指定分割符 === 从外向内依次指定
create table test_map(id int,name string,piaofang map<string,bigint>) row format delimited fields terminated by ‘\t’ collection items terminated by ‘,’ map keys terminated by ‘:’;
数据导入:
load data local inpath ‘/home/hadoop/apps/test_map’ into table test_map;
数据查询:
select piaofang[‘paonan’] from test_map;

struct:数据比较规程,数据中的每一个字段对应的含义一样

id name age
1 zs 23
2 ls 32
class {
id;
name;
age;
}
数据:
id name info
1 zs xian,20,680
2 zl wuhan,18,520
3 xh shenzheng,17,490
建表:
create table test_struct(id int,name string,info structchushengdi:string,age:int,score:int) row format delimited fields terminated by ‘\t’ collection items terminated by ‘,’;
collection items terminated by ‘,’:指定struct的每一个属性之间的分割符
加载数据:
load data local inpath ‘/home/hadoop/apps/test_struct’ into table test_struct;
数据查询:
通过.进行数据访问
select info.chushengdi,info.score from test_struct;

hive的窗口函数

用于解决 topN 动态分组的问题 累加计算的问题等
样例数据:
userid userdate count
A 2015-01 5
A 2015-01 15
B 2015-01 5
A 2015-01 8
B 2015-01 25
A 2015-01 5
A 2015-02 4
A 2015-02 6
B 2015-02 10
B 2015-02 5
A 2015-03 16
A 2015-03 22
B 2015-03 23
B 2015-03 10
B 2015-03 11
1)over子句
相当于单独的一个计算语句 这个计算语句相当于重新取数据进行计算 可以指定分组条件和排序规则的 不是一定需要同时指定的 按需指定
over(distribute by sort by)
over(partition by order by)
1)聚合函数+over 版本2.1之后
count sum avg max min
这时候的聚合函数 是根据over子句指定的规则进行聚合的
select userid,userdate,sum(count) over(distribute by userid,userdate) from user_info;
select userid,userdate,sum(count) from user_info group by userid,userdate;

A 2015-01 5 33
A 2015-01 15 33
A 2015-01 8 33
A 2015-01 5 33
A 2015-02 6 10
A 2015-02 4 10
A 2015-03 16 38
A 2015-03 22 38
B 2015-01 25 30
B 2015-01 5 30
B 2015-02 10 15
B 2015-02 5 15
B 2015-03 11 44
B 2015-03 23 44
B 2015-03 10 44

去重:
select distinct userid,userdate,sum(count) over(distribute by userid,userdate) from user_info;
A 2015-01 33
A 2015-02 10
A 2015-03 38
B 2015-01 30
B 2015-02 15
B 2015-03 44

select distinct userid,userdate,sum(count) over(distribute by userid,userdate sort by userdate) from user_info;
A 2015-01 33
A 2015-02 10
A 2015-03 38
B 2015-01 30
B 2015-02 15
B 2015-03 44

2)分析函数:
row_number
rank
dense_rank
3)over子句中可以指定统计的数据的范围
用于指定聚合函数的统计的数据的范围的
(ROWS | RANGE 指定行) BETWEEN and指定行的范围的
UNBOUNDED 无边界 向前到第一条数据 向后最后数据
| [num]) PRECEDING 向前几行的数据
CURRENT ROW 当前行
[num]) FOLLOWING) 向后几行的数据
没有指定需要统计的数据范围 默认是全部的数据
select userid,userdate,count,sum(count) over(distribute by userid,userdate sort by userdate rows between CURRENT row and UNBOUNDED FOLLOWING) from user_info;

4)窗口函数和over子句连用
lag(需要取的字段,偏移量,如果取不到 给的默认值)
偏移量 取前面的
lead 取后面的
比赛数据分析
这个人 赛成绩
1 182828 6
2 272873 7

select userid,userdate,count,lag(count,1,0) over(distribute by userid,userdate sort by userdate) from user_info;
select userid,userdate,count,lead(count,1,0) over(distribute by userid,userdate sort by userdate) from user_info;
first_value(需要获取的字段) 分组的第一个值
last_value 分组的最后一个值
select userid,userdate,count,first_value(count) over(distribute by userid,userdate sort by count) from user_info;
select userid,userdate,count,last_value(count) over(distribute by userid,userdate sort by count) from user_info;

mysql写的顺序及执行顺序

写的顺序:
select … from …where …group by…having…order by…limit
执行顺序:
from
where
group by 不能使用select后面的字段别名的 必须使用原声的
having
select
order by 可以使用select后面的字段的别名的
注:本博客内容后续会不断补充完善

猜你喜欢

转载自blog.csdn.net/w_h_guang/article/details/83446412