1、社交粉丝数据分析:求共同好友,相同key的value发送到同一个reduce里面去(分区)。相同key合并,value形成一个集合(分组)
2、倒排索引建立:哪个单词在哪个文章当中出现了多少次
3、自定义inputFormat合并小文件:尽量避免小文件的产生
1、上传之前的合并(文件必须是同一类型的)
2、上传之后的文件的合并,自定义inputformat实现小文件合并,最后文件输出二进制格式sequenceFile.
3、har归档文件
4、自定义outputformat实现文件的多路径输出 拿FileSplit ==》FileSystem ==》 Configuration ==》Context
5、分组求topN
使用MR实现分组求topN
我们需要求出每个订单里面金额最大的那一个商品 ==》 分组求top1
第一步:读取文件
第二步:自定义mapper类 输出k2 orderBean v2 NullWritable
第三步:自定义orderBean 两个属性 OrderId, money
第四步: 保证相同的orderId的数据发送到同一个reduce里面去,自定义分区,按照OrderBean 的属性 OrderId来进行分区
第五步:排序。首先比较订单id,相同的订单id按照金额进行排序
第六步:规约 省掉
第七步:分组 ,自定义分组。将相同key合并,value形成一个集合。如何比较OrderBean是否相等,默认使用的是(orderId + money ).toString()
提问:可不可以重写toString() 里面只有一个字段 orderId
第八步:自定义reduce类
第九步:最后输出数据
mapreduce的参数的优化:参数的调优
yarn的资源调度:yarn进行资源调度
resourceManager,NodeManager,ApplicationMaster , container
yarn当中的调度器
1、队列调度器 FIFO
2、容量调度器 capacity scheduler apache
3、公平调度器 fair scheduler cdh
yarn当中常用的一些参数设置
1、数仓的基本概念 基本了解
2、hive的基本概念 掌握
3、hive的基本操作 (建库语法,建表语法) 掌握
4、hive当中shell参数 掌握
5、hive当中的函数 掌握
6、hive的数据压缩 掌握
7、hive当中的数据存储格式 掌握
8、hive当中的存储与压缩相结合 掌握
9、hive调优 先了解,面试的时候再来背
10、作业 ,hive语句的综合练习
sql语句是你们需要长期坚持奋斗的一个事业
粮仓:装粮食的。粮仓不生产粮食。粮仓也不会消耗粮食。仓库主要用于存储的功能,粮食由外部提供,开放给外部使用
数据仓库:Data ware house DW 或者 DWH 。也是一个仓库的概念。数据的仓库主要是用来装数据的,既不生产数据,也不消耗数据,数据由外部提供,开发给外部使用。主要作用是面向分析的。分析我们数据仓库里面的数据。
数据仓库的主要特征:
1、面向主题。每个数据仓库面向分析的主题都是一样的
2、集成性。数据仓库需要分析某一个主题的数据结果,需要集成各个其他方面的数据
3、非易失性。不可更新性。所有的分析的数据,都是面向历史已经发生过的事情
4、时变性。随着时间的发展,数据仓库的分析的手段也在不断的变化
1:数据仓库的主要作用:主要作用是面向分析的,分析我们的历史数据,叫做OLAP 叫联机分析处理 OLAP(On-Line Analytical Processing)。不需要提供事务的保证。主要作用就是写各种select语句
2、数据库的主要作用。主要使用与事务的保证,叫做OLTP 叫联机事务处理 OLTP(On-Line Transaction Processing,)可以通过数据库的事务的保证,保证我们业务系统正常的运行
很早很早就有数仓的概念:mysql或者oracle加kettle
如何理解数据库与数据仓库的概念:数据仓库是将所有用到的数据库里面的数据都抽取过来,集中到一起组成我们的数据仓库
数据仓库,是在数据库已经大量存在的情况下,为了进一步挖掘数据资源、为了决策需要而产生的,它决不是所谓的“大型数据库”。
主要分为三层
第一层:源数据层。我们的数据的来源,也叫ODS
第二层:数据仓库层。DW层 。主要用于各种分析sql语句 。
第三层:数据应用层app层。数据展示层。主要就是使用各种报表,展示我们最终分析的结果
ETL:extract抽取 transform转换 load 加载
元数据:描述数据的数据
主要用于描述数据库的建库语法,记录建表语法,记录我们数据流转过程。元数据记录了我们数据仓库各个步骤如何执行。等到数据仓库需要正常的运转,每一步如何执行,都直接去查询元数据信息即可
hive可以将结构化的数据,映射成为一张数据库表
结构化数据:类似于数据库当中表结构。字段个数一定。字段类型也定好了
半结构化的数据:xml或者json。字段个数不定。字段类型可定
非结构化的数据:音频或者视频等等。
hive使用的是hdfs进行数据的存储,使用MR来进行的数据的计算
hive的架构:
第一部分:用户接口,客户端
第二部分:解析器 就是将我们sql语句翻译成mr的job任务,提交给resourcemanager去执行
编译器:主要就是编译我们的hql语句,将hql语句转换成mr的任务
优化器:会对我们hql语句做一定的调优
执行器:最后提交job任务给resourceManager
第三部分:hadoop集群 执行hive提交的任务
第四步:元数据信息。保存在mysql里面
linux当中前台和后台启动进程
前台启动进程: bin/hive --service hiveserver2
后台启动进程: nohup bin/hive --service hiveserver2 2>&1 &
hive客户端三种交互方式
第一种交互方式:bin/hive
第二种交互方式:
启动服务端
bin/hive --service hiveserver2
启动beeline客户端
bin/beeline
!connect jdbc:hive2://node03:1000
第三种:不进入hive客户端直接执行hql语句
bin/hive -e “select * from myhive.test;”
bin/hive -f /export/servers/hive.sql
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] 指定hdfs的数据存放的位置
create table student(id int,name string)
删除表的时候,会将hdfs的数据一起删除
创建的时候,不要加external 关键字,如果加了external 关键字就是一个外部表,不加就是内部表
内部表当中每插入一条数据,就会生产一个小文件。注意:hive不是用来做频繁的插入的。
hive当中不接受update和delete语句。
hive是一个用于做数据仓库的一个工具。数据仓库里面装的都是历史已经发生的数据,不能随便的改变。所以hive不支持update和delete
如果建表的时候不指定字段之间的分隔符,默认使用的分隔符是\001.\001在程序当中表示的是asc 码值,是一个非打印字符
创建内部表并指定字段之间的分隔符,并指定文件存个格式,并指定表的存放点额hdfs的位置
创建表并指定字段之间的分隔符
create table if not exists stu2(id int ,name string) row format delimited fields terminated by '\t' stored as textfile location '/user/stu2';
根据查询结果来创建表,并且复制表数据到新表里面去
create
table stu3 as select * from stu2;
根据已经存在的表结构创建表。只是创建表结构,不会复制表数据
create table stu4 like stu2;
内部表删除表的时候,hdfs上面的数据一起要删掉
加载数据
insert
load 必须掌握
第二种表模型:外部表 创建表的时候需要加上关键字external 删除表的时候,不会删除hdfs上面的数据
外部表加载数据
inert
load 必须掌握
load data [local] inpath ‘/export/servers/hivedatas/student.csv’ overwrite into table student;
local:表示我们从本地文件磁盘加载数据,没有local表示我们从hdfs上面加载数据
overwrite :表示数据的覆盖,如果重复的加载重复的数据,数据会覆盖掉
总结:如果从本地文件加载数据,数据只是从本地文件复制到hdfs对应的表路径下面去了(相当于一个复制的操作)
如果是从hdfs加载数据,数据会从hdfs的路径移动到表的location路径下面去(相当于剪切的操作)
外部表删除表的时候,不会删除hdfs的数据
第三种表模型:分区表
分区表不是一个独立的表模型,一般都是与外部表或者内部表搭配使用
external 外部表
没有external 内部表
就是用于分文件夹的
select * from table where create_time > 2018-12-26
分区表就是分文件夹,将我们一整份大的文件,划分成好多的小的文件,每个小文件给一个标识,到时候我们获取的时候,就可以直接通过标识进行过滤,减少mr程序输入的数据量,mr程序会运行的更快
分区表加载数据的语法
load data local inpath ‘/path’ into table xxx partition(month=‘xxx’)
第四种表模型:分桶表
分区表是分文件夹
分桶表:分文件
通过指定多个reduceTask,可以按照某个字段进行mr的分区,然后将数据划分到不同的文件里面去,将一个大的文件,划分成多个小文件
四种表模型的总结梳理:
内部表:又叫管理表,删除表的时候删除hdfs的数据
外部表:external 删除表的时候,不删除hdfs的数据
分区表:分文件夹 partitioned by (month string)
分桶表:分文件 clustered by (c_id) into 3 buckets
纯粹的内部表 纯粹的外部表 内部分区表 内部分桶表 外部分区表 外部分桶表 内部分区分桶表 外部分区分桶表
不管任何的表模型,都是为了解决一个问题,将一个大的数据,划分成多个小数据,使hive运行起来更快
第一种加载数据的方式:墙裂不推荐使用
insert into table score3 partition(month='201812') values ('001','002',100);
第二种加载数据的方式
通过load方式加载数据
load data local inpath ‘/export/servers/hivedatas/score.csv’ overwrite into table score partition(month=‘201806’);
通过查询方式加载数据
create table score4 like score;
insert overwrite table score4 partition(month = ‘201806’) select s_id,c_id,s_score from score;
注意:如果是分区表,那么我们将数据放到对应的分区下面之后,我们需要msck repair table
如果是普通的外部表的话,数据放到对应的路径下面去就可以查询得到
将hive表里面的数据导出来保存到hdfs或者本地文件磁盘
order by 全局排序,所有的数据都是有序的,只能有一个reduceTask。如果数据量很大,效率很低
sort by : reduceTask内部有序。只能够保证每个reduceTask内部有序,全局无序
distributed by : 指定字段进行mr当中的分区字段
insert overwrite local directory
‘/export/servers/hivedatas/sort’ select * from score distribute by s_id sort by
s_score;
表示我们在执行mr程序的时候,指定我们使用哪个字段来进行分区 。 distribute by s_id 指定我们使用s_id这个字段来进行分区操作 (s_id.hashcode & integer.max_value) % numReduceTasks
sort by :reduce内部的排序
如果 distributed by 的字段与sort by 的字段一致,那么我们就可以用cluster by来代替掉
cluster by s_socre = distributed by s_score sort by s_score
hive是最早出现的一款sql on hadoop 的软件
sql on hadoop
hive运行的时候如何给hive设置一些参数
第一种配置参数的方式:配置文件 hive-site.xml.对所有的会话都有效
第二种配置:命令行参数:启动hvie的时候可以配置一些参数
bin/hive -hiveconf hive.root.logger=INFO,console
第三种:参数声明
set mapred.reduce.tasks=10;
参数声明 > 命令行的参数 > 配置文件的参数
!
!=
%
&
*
+
-
/
<
<=
<=>
<>
=
==
>
>=
^
abs
acos
add_months
and
array
array_contains
ascii
asin
assert_true
atan
avg
base64
between
bin
case
cbrt
ceil
ceiling
coalesce
collect_list
collect_set
compute_stats
concat
concat_ws
context_ngrams
conv
corr
cos
count
covar_pop
covar_samp
crc32
create_union
cume_dist
current_database
current_date
current_timestamp
current_user
date_add
date_format
date_sub
datediff
day
dayofmonth
dayofweek
decode
degrees
dense_rank
div
e
elt
encode
ewah_bitmap
ewah_bitmap_and
ewah_bitmap_empty
ewah_bitmap_or
exp
explode
field
find_in_set
first_value
floor
format_number
from_unixtime
from_utc_timestamp
get_json_object
greatest
hash
hex
histogram_numeric
hour
if
in
in_file
index
initcap
inline
instr
isnotnull
isnull
java_method
json_tuple
lag
last_day
last_value
lcase
lead
least
length
levenshtein
like
ln
locate
log
log10
log2
logged_in_user
lower
lpad
ltrim
map
map_keys
map_values
matchpath
max
md5
min
minute
month
months_between
named_struct
negative
next_day
ngrams
noop
noopstreaming
noopwithmap
noopwithmapstreaming
not
ntile
nvl
or
parse_url
parse_url_tuple
percent_rank
percentile
percentile_approx
pi
pmod
posexplode
positive
pow
power
printf
radians
rand
rank
reflect
reflect2
regexp
regexp_extract
regexp_replace
repeat
reverse
rlike
round
row_number
rpad
rtrim
second
sentences
sha2
sign
sin
size
sort_array
soundex
space
split
sqrt
stack
std
stddev
stddev_pop
stddev_samp
str_to_map
struct
substr
substring
sum
tan
to_date
to_unix_timestamp
to_utc_timestamp
translate
trim
trunc
ucase
unbase64
unhex
unix_timestamp
upper
uuid
var_pop
var_samp
variance
version
weekofyear
when
windowingtablefunction
xpath
xpath_boolean
xpath_double
xpath_float
xpath_int
xpath_long
xpath_number
xpath_short
xpath_string
year
|
~
1)查看系统自带的函数
hive> show functions;
2)显示自带的函数的用法
hive> desc function upper;
3)详细显示自带的函数的用法
hive> desc function extended upper;
hive当中自定义函数的开发
udf:一行进入一行处理
udaf:多行进 ,一行出 count()
udtf: 一行进,多行出 lateral view explore(); 可以将一列数据,拆分成多列数据
hive udf 函数自定义开发
json格式的数据,转换成一个标准四个字段的数据表
{“movie”:“1193”,“rate”:“5”,“timeStamp”:“978300760”,“uid”:“1”}
第一步:创建一个表 就一个字段 ,加载json格式的数据
temp_table(jsonstr string);
第二步:开发自定义函数 接收json格式的数据,转换成成
1193 5 978300760 1
第三步:insert overwrite local directory select myfunc(jsonstr) from temp_table;
第四步:load data local inpath “/export/servers/json” into table finalTab
我告诉你们怎么做,你们自己能够做出来
第一类:我不告诉你怎么做,你自己就能做出来
第二类:我告诉你怎么做,你就能够实现出来 可培养
第三类:我告诉你怎么做,你也不会做
任何一个公司绝对不会白养闲人
主要就是将我们数据压缩成小数据,用的是空间换时间概念。可以减少数据网络传输,可以解决我们网络拷贝时间
使用snappy压缩算法。如何支持snappy压缩,自己重新编译hadoop
1、数据仓库的基本概念
数据仓库分层:
第一层:源数据层 ODS层
第二层:数据仓库层 DW层
第三层:数据应用 数据展示层 APP层
2、hive的安装以及hive的三种交互方式 搞定
3、hive的基本操作
建库语法:create database
建表语法:内部表,外部表,分区表,分桶表 搞定
hive当中表加载数据 一定要搞定
load data
insert overwrite select
hive当中表数据导出 了解一下
4、hive当中的查询语法 好好看一看
group by select 的字段必须在group by 字段里面挑
排序:order by sort by distriebuted by sort by cluster by
5、hive当中的shell参数
如何传递参数到hive当中去
6、hive当中的函数
desc function extended upper;
hive的自定义函数 尽量实现json转字符串
7、hive的数据压缩 搞定
压缩方式snappy ,重新编译支持snappy