数据仓库概念
传统数据仓库面临的挑战
Hive简介
Hive特点
Hive与Hadoop生态系统中其他组件的关系(略)
Hive与传统数据库的对比分析
Hive在企业中的部署和应用
SQL语句转换成MapReduce作业的基本原理
Hive SQL查询转换成MapReduce作业的过程
当用户向Hive输入一段命令或查询时,Hive需要与Hadoop交互工作来完成该操作:
Step
说明
Impala简介
Impala系统架构
Impala和Hive、HDFS、HBase等工具是统一部署在一个Hadoop平台上的;
Impala主要由Impalad,State Store和CLI三部分组成;
说明:
Impala中的元数据直接存储在Hive中。Impala采用与Hive相同的元数据、SQL语法、ODBC驱动程序和用户接口,从而使得在一个Hadoop平台上,可以统一部署Hive和Impala等分析工具,同时支持批处理和实时查询。
Impala查询执行过程
Impala与Hive的比较
MySQL 安装与设置
为什么安装 MySQL 而不使用 Hive 自带的 derby?
使用 derby 不能开启多个 hive 客户端连接!
下载并安装 MySQL 官方的 Yum Repository,采用wget方式进行安装
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
使用上面的命令就直接下载了安装用的Yum Repository,大概25KB,然后就可以直接应用yum进行安装了,命令及执行效果如下:
sudo yum -y install mysql57-community-release-el7-10.noarch.rpm
安装Mysql服务器
sudo yum -y install mysql-community-server
启动Mysql并查看运行状态
sudo systemctl start mysqld.service
sudo systemctl status mysqld.service
修改默认密码
sudo grep "password" /var/log/mysqld.log
mysql -u root -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Hive@2020';
注意:密码设置必须要大小写字母数字和特殊符号,不然不能配置成功。
开启mysql的远程访问
执行以下命令开启远程访问限制(注意:下面命令开启所有的IP,如要开启某个具体IP是192.168.150.71,则将%替换成IP地址):
grant all privileges on *.* to 'root'@'%' identified by 'Hive@2020' with grant option;
刷新权限:
flush privileges;
.修改mysql的字符编码以防止中文乱码问题
show variables like '%character%';
character_set_server=utf8
init_connect='SET NAMES utf8'
sudo systemctl restart mysqld
Hive安装
下载Hive;
文件解压与赋权:
sudo tar -zxvf ./Downloads/apache-hive-3.1.2-bin.tar.gz -C /usr/local
cd /usr/local/
sudo mv apache-hive-3.1.2-bin hive
sudo chown -R hadoop ./hive
Hive环境变量配置:vim ~/.bashrc
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin
记住:source ~/.bashrc
修改配置文件
<configuration>
<property>
<name>javax.jdo.option.ConnectionURLname>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8&useSSL=falsevalue>
<description>
JDBC connect string for a JDBC metastore.
To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL.
For example, jdbc:postgresql://myhost/db?ssl=true for postgres database.
description>
property>
<property>
<name>javax.jdo.option.ConnectionDriverNamename>
<value>com.mysql.jdbc.Drivervalue>
<description>Driver class name for a JDBC metastoredescription>
property>
<property>
<name>javax.jdo.option.ConnectionUserNamename>
<value>hivevalue>
<description>Username to use against metastore databasedescription>
property>
<property>
<name>javax.jdo.option.ConnectionPasswordname>
<value>hivevalue>
<description>password to use against metastore databasedescription>
property>
<property>
<name>hive.metastore.warehouse.dirname>
<value>/hive/warehousevalue>
<description>location of default database for the warehousedescription>
property>
<property>
<name>hive.metastore.schema.verificationname>
<value>falsevalue>
property>
<property>
<name>datanucleus.readOnlyDatastorename>
<value>falsevalue>
property>
<property>
<name>datanucleus.fixedDatastorename>
<value>falsevalue>
property>
<property>
<name>datanucleus.autoCreateSchemaname>
<value>truevalue>
property>
<property>
<name>datanucleus.schema.autoCreateAllname>
<value>truevalue>
property>
<property>
<name>datanucleus.autoCreateTablesname>
<value>truevalue>
property>
<property>
<name>datanucleus.autoCreateColumnsname>
<value>truevalue>
property>
<property>
<name>hive.metastore.localname>
<value>truevalue>
property>
<property>
<name>hive.cli.print.headername>
<value>truevalue>
property>
<property>
<name>hive.cli.print.current.dbname>
<value>truevalue>
property>
configuration>
Hive的MySQL配置
sudo tar -zxvf ./Downloads/mysql-connector-java-5.1.49.tar.gz -C /usr/local #解压
cd /usr/local/
cp mysql-connector-java-5.1.49/mysql-connector-java-5.1.49-bin.jar ./hive/lib
启动hive
cd /usr/local/hive
./bin/schematool -dbType mysql -initSchema
./bin/hive
./bin/schematool -dbType mysql -initSchema
schematool -dbType mysql -initSchema
知识准备
创建数据库、表、视图
create [external] table [if not exists] table_name
[(col_1 dt [comment c_com_1],col_2 dt [comment c_com_2],...)]
[partitioned by (col dt,...)];
查看数据库、表
修改数据库、表
ALTER DATABASE
命令为某个数据库的DBPROPERTIES设置键-值对属性值,来描述这个数据库的属性信息,数据库的其它元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置删除数据库、表
向表中装载数据
向表中插入数据
从查询表中数据
select id,name
case
when id=1 then 'first'
when id=2 then 'second'
else 'other' end from student;
select stu.*, course.* from stu join course on(stu.id=course.sid);
select stu.*, course.* from stu left outer join course on(stu.id=course.sid);
select stu.*, course.* from stu right outer join course on(stu.id=course.sid);
select stu.*, course.* from stu full outer join course on(stu.id=course.sid);
select stu.* from stu left semi join course on(stu.id=course.sid);
实战一:创建person表并把下述数据文件内容载入person表;
jack,mary_tom,jackson:18_jackcon:19,NC_JX
tom,jack_frank,tomsom:21_tomson:16,SY_LN
实战二:Word Count,统计单词出现的次数,共三个文件fileA.txt、fileB.txt、fileC.txt,内容分别为“hello world”,“hello hadoop”,“hello hive”;
默认创建的表都是所谓的管理表,有时也被称为内部表,因为这种表,Hive会或多或少地控制着数据的生命周期。Hive默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse/dir所定义的目录或其子目录下。当我们删除一个管理表时,Hive也会删除这个表中的数据。管理表不适合和其它工具共享数据。
Hive创建外部表时,仅记录数据所在的路径,不会对数据的位置做任何改变。外部表与内部表的主要区别在于删除外部表时,Hive不会删除这个表中的数据,重新创建该表仍然可以查到该数据(Mysql的元数据与Hdfs的原数据缺失任何一个都不能查询到该表的数据,且它们数据的先后,即先有元数据或先有原数据,不影响表数据的查询;Hive删除外部表只是删除元数据,但删除内部表会删除元数据与原数据)。
管理表与外部表的的互相转换:
注:‘EXTERNAL’='FALSE’必须大写;
分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句的表达式选择查询所需要的指定的分区能够提高查询效率(避免全表扫描)。
分区表基本操作
载入数据
查询数据
查看分区
载入数据:略
HDFS创建分区目录并上传数据如何通过select查询到(即需要添加元数据信息)
官方手册
函数 | 功能说明 |
---|---|
avg(x) | 平均数 |
count([DISTINCT] col) | 记录数,count(distinct x)为去重后的数量 |
sum(x) | 总数,求和 |
max(x) | 最大值,日期时间字段为最近的 |
min(x) | 最小值,日期时间字段为最早的 |
collect_set(col) | 收集group by聚合字段,返回去重后的数组(集合) |
collect_list(col) | 收集group by聚合字段,返回不去重后的数组 |
ntile(INTEGER x) | 用于将分组数据按照顺序切分成n片,返回当前切片值 |
函数 | 功能说明 |
---|---|
cast(expr as ) | 转换表达式expr为type类型 |
length(int/str) | 长度 |
reverse(int/str) | 反转顺序 |
concat(1,2,‘a’) | 字符串连接 |
concat_ws(‘-’,‘a’,‘b’) | 指定分隔符的字符串连接 |
substr(‘foobar’,begin,num) | 字符串截取。或substring |
substring_index(str,‘-’,2) | 分隔后取前几块 |
instr(‘abc’,‘ab’) | 子串的位置,0为不存在 |
locate(‘a’,‘abc’,1) | 子串是否存在,见例 |
upper,ucase | 转大写 |
lower,lcase | 转小写 |
trim ltrim rtrim | 去空格,左右空格 |
parse_url | URL解析函数 |
get_json_object | json解析函数 |
space | 空格字符串函数 |
repeat | 重复字符串函数 |
ascii | 首字符Ascii函数 |
lpad | 左补足函数 |
rpad | 右补足函数 |
split | 字符串分割函数 |
find_in_set | 集合查找函数 |
regexp_replace | 正则表达式替换函数 |
regexp_extract | 正则表达式解析函数 |
函数 | 功能说明 |
---|---|
array_contaions(Array, value) | 返回Arrat是否包含value |
size(Map |
返回Map的大小 |
size(Array) | 返回Array的大小 |
map_keys(Map |
返回Map的key集合 |
map_values(Map |
返回Map的value集合 |
sort_array(Array) | 返回排序后的Array |
函数 | 功能说明 |
---|---|
+、-、*、/ | 加减乘除 |
% | 取余 |
DIV | 取整数部分 |
AND、OR、NOT | 与、或、非 |
[NOT] IN (val1,val2,…) | |
[NOT] EXISTS (subquery) | |
=、<> | 等值、不等值比较 |
>,< | 大于、小于 |
>=、<= | 大于等于、小于等于 |
IS [NOT] NULL | 空值、非空值判断 |
REGEXP | 正则表达式判断 |
函数 | 功能说明 |
---|---|
rank() | 相同值序号一样,跳过下个序号 |
dense_rank() | 相同值序号一样,不跳过下个序号 |
row_number() | 顺序排序,值同序号不同,序号不重 |
cume_dist() | 同列占比,小于等于当前值的行数/分组内总行数 |
lag(col,n=1,DEFAULT) | 统计窗口内往上第n行值 |
lead(col,n=1,DEFAULT) | 统计窗口内往下第n行值 |
first_value(col) | 分组内排序后,截止到当前行第一个值 |
last_value(col) | 分组内排序后,截止到当前行最后一个值 |
函数 | 功能说明 |
---|---|
current_timestamp() | 当前时间 |
current_date() | 当前日期 |
unix_timestamp(time,format) | 指定格式日期转UNIX时间戳 |
from_unixtime() | UNIX时间戳转日期 |
to_date() | 日期时间转日期 |
date_format(time,format) | 时间日期格式化 |
year() month() day() | 日期转年、月、日 |
hour() minute() second() | 日期转时、分、秒 |
weekofyear() | 日期转周 |
datediff() | 日期比较,时间相差 |
date_add() | 日期增加 |
date_sub() | 日期减少 |
trunc(date[,fmt]) | 指定元素截去日期值 |
函数 | 功能说明 |
---|---|
if(condition,value when true,value when false) | 条件判断 |
case when | 多条件分支 |
coalesce(a1,a2,…,an) | 返回第一个不为Null的值 |
isnull(a)\isnotnuall(a) | 判断是否为/不为空值 |
nvl(a,b) | a为Null时返回b,否则为a |
nullif(a,b) | a=b时,返回NULL,否则为a |
混合函数
虚表生成:略
其它
Source
Hadoop Course PPT and Word of NEU