文章目录
- 基于Hadoop的数据仓库Hive的介绍、安装与基本应用
- 一、概述
- 二、Hive系统架构
- 三、Hive工作原理
- 四、Hive HA基本原理
- 五、Impala
- 六、Hive安装
- 七、Hive编程实战
- 附一:管理表(内部表)
- 附二:外部表
- 附三:分区表
- 附四:Hive SQL 查询函数手册
基于Hadoop的数据仓库Hive的介绍、安装与基本应用
一、概述
- 数据仓库概念
- 数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策;
- 数据仓库的体系结构
- 传统数据仓库面临的挑战
- 无法满足快速增长的海量数据存储需求
- 无法有效处理不同类型的数据
- 计算和处理能力不足
- Hive简介
- Hive是一个构建于Hadoop顶层的数据仓库工具;
- 支持大规模数据存储、分析,具有良好的可扩展性;
- 某种程度上可以看作是用户编程接口,本身不存储和处理数据;
- 依赖分布式文件系统HDFS存储数据;
- 依赖分布式并行计算模型MapReduce处理数据;
- 定义了简单的类似SQL 的查询语言——HiveQL;
- 用户可以通过编写的HiveQL语句运行MapReduce任务;
- 它可以很容易把原来构建在关系数据库上的数据仓库应用程序移植到Hadoop平台上;
- 它是一个可以提供有效、合理、直观组织和使用数据的分析工具;
- Hive特点
- 采用批处理方式处理海量数据
- Hive需要把HiveQL语句转换成MapReduce任务进行运行
- 数据仓库存储的是静态数据,对静态数据的分析适合采用批处理方式,不需要快速响应给出结果,而且数据本身也不会频繁变化
- 提供适合数据仓库操作的工具
- Hive本身提供了一系列对数据进行提取、转换、加载(ETL)的工具,可以存储、查询和分析存储在Hadoop中的大规模数据
- 这些工具能够很好地满足数据仓库各种应用场景
- Hive与Hadoop生态系统中其他组件的关系(略)
- Hive与传统数据库的对比分析
- Hive在企业中的部署和应用
- Hive在企业大数据分析平台中的应用
- Hive在Facebook公司中的应用
- 基于Oracle的数据仓库系统已经无法满足激增的业务需求
- Facebook公司开发了数据仓库工具Hive,并在企业内部进行了大量部署
二、Hive系统架构
- 用户接口模块包括CLI、HWI、JDBC、ODBC、Thrift Server;
- 驱动模块(Driver)包括编译器、优化器、执行器等,负责把HiveSQL语句转换成 一系列MapReduce作业;
- 元数据存储模块(Metastore)是一个独立的关系型数据库(自带derby数据库,或MySQL数据库);
三、Hive工作原理
- SQL语句转换成MapReduce作业的基本原理
- join的实现原理
- group by的实现原理
select rank, level ,count(*) as value from score group by rank, level
- Hive SQL查询转换成MapReduce作业的过程
- 当用户向Hive输入一段命令或查询时,Hive需要与Hadoop交互工作来完成该操作:
- 驱动模块接收该命令或查询编译器;
- 对该命令或查询进行解析编译;
- 由优化器对该命令或查询进行优化计算;
- 该命令或查询通过执行器进行执行;
- Step
- 由Hive驱动模块中的编译器对用户输入的SQL语言进行词法和语法解析,将SQL语句转化为抽象语法树的形式;
- 抽象语法树的结构仍很复杂,不方 便直接翻译为MapReduce算法程序,因此把抽象语法树转化为查询块;
- 把查询块转换成逻辑查询计划,里面包含了许多逻辑操作符;
- 重写逻辑查询计划,进行优化,合并多余操作,减少MapReduce任务数量;
- 将逻辑操作符转换成需要执行的具体MapReduce任务;
- 对生成的MapReduce任务进行优化,生成最终的MapReduce任务执行计划;
- 由Hive驱动模块中的执行器,对最终的MapReduce任务进行执行输出;
- 说明
- 当启动MapReduce程序时,Hive本身是不会生成MapReduce算法程序的;
- 需要通过一个表示“Job执行计划”的XML文件驱动执行内置的、原生的Mapper和Reducer模块;
- Hive通过和JobTracker通信来初始化MapReduce任务,不必直接部署在JobTracker所在的管理节点上执行;
- 通常在大型集群上,会有专门的网关机来部署Hive工具,网关机的作用主要是远程操作和管理节点上的JobTracker通信来执行任务;
- 数据文件通常存储在HDFS上,HDFS由名称节点管理;
四、Hive HA基本原理
- 由多个Hive实例进行管理的,这些Hive实例被纳入到一个资源池中,并由HAProxy提供一个统一的对外接口;
- 对于程序开发人员来说,可以把它认为是一台超强“Hive";
五、Impala
- Impala简介
- Impala是由Cloudera公司开发的新型查询系统,它提供SQL语义,能查询存储在Hadoop的HDFS和HBase上的PB级大数据,在性能上比Hive高出3~30倍;
- Impala的运行需要依赖于Hive的元数据;
- Impala是参照 Dremel系统进行设计的;
- Impala采用了与商用并行关系数据库类似的分布式查询引擎,可以直接与HDFS和HBase进行交互查询;
- Impala和Hive采用相同的SQL语法、ODBC驱动程序和用户接口;
- Impala与其它组件的关系;
- Impala系统架构
- Impala和Hive、HDFS、HBase等工具是统一部署在一个Hadoop平台上的;
- Impala主要由Impalad,State Store和CLI三部分组成;
- Impalad
- 负责协调客户端提交的查询的执行;
- 包含Query Planner、Query Coordinator和Query ExecEngine三个模块;
- 与HDFS的数据节点(HDFS DN)运行在同一节点;
- 给其他Impalad分配任务以及收集其他Impalad的执行结果进行汇总;
- Impalad也会执行其他Impalad给其分配的任务,主要就是对本地HDFS和HBase里的部分数据进行操作;
- State Store
- 会创建一个statestored进程;
- 负责收集分布在集群中各个Impalad进程的资源信息,用于查询调度;
- CLI
- 给用户提供查询使用的命令行工具;
- 还提供了Hue、JDBC及ODBC的使用接口;
说明:
Impala中的元数据直接存储在Hive中。Impala采用与Hive相同的元数据、SQL语法、ODBC驱动程序和用户接口,从而使得在一个Hadoop平台上,可以统一部署Hive和Impala等分析工具,同时支持批处理和实时查询。
- Impala查询执行过程
- Step 0
- 当用户提交查询前,Impala先创建一个负责协调客户端提交的查询的Impalad进程,该进程会向Impala State Store提交注册订阅信息,State Store会创建一个statestored进程,statestored进程通过创建多个线程来处理Impalad的注册订阅信息.
- Step 1
- 用户通过CLI客户端提交一个查询到impalad进程,Impalad的Query Planner对SQL语句进行解析,生成解析树;然后,Planner把这个查询的解析树变成若干PlanFragment,发送到Query Coordinator.
- Step 2
- Coordinator通过从MySQL元数据库中获取元数据,从HDFS的名称节点中获取数据地址,以得到存储这个查询相关数据的所有数据节点.
- Step 3
- Coordinator初始化相应impalad上的任务执行,即把查询任务分配给所有存储这个查询相关数据的数据节点.
- Step 4
- Query Executor通过流式交换中间输出!!!,并由Query Coordinator汇聚来自各个impalad的结果.
- Step 5
- Coordinator把汇总后的结果返回给CLI客户端
- Impala与Hive的比较
- 不同点
- Hive适合于长时间的批处理查询分析,而Impala适合于实时交互式SQL查询;
- Hive依赖于MapReduce计算框架,Impala把执行计划表现为一棵完整的执行计划树,直接分发执行计划到各个Impalad执行查询;
- Hive在执行过程中,如果内存放不下所有数据,则会使用外存,以保证查询能顺序执行完成,而Impala在遇到内存放不下数据时,不会利用外存,所以Impala目前处理查询时会受到一定的限制;
- 相同点
- Hive与Impala使用相同的存储数据池,都支持把数据存储于HDFS和HBase中;
- Hive与Impala使用相同的元数据;
- Hive与Impala中对SQL的解释处理比较相似,都是通过词法分析生成执行计划;
- 总结
- Impala的目的不在于替换现有的MapReduce工具;
- 把Hive与Impala配合使用效果最佳;
- 可以先使用Hive进行数据转换处理,之后再使用Impala在Hive处理后的结果数据集上进行快速的数据分析;
六、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
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不是utf-8,修改/etc/my.cnf(sudo vim /etc/my.cnf)(输入如下参数选项)
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
- 修改配置文件
- 新建hive-site.xml,添加如下配置信息
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false</value>
<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.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>Username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
<description>password to use against metastore database</description>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>datanucleus.readOnlyDatastore</name>
<value>false</value>
</property>
<property>
<name>datanucleus.fixedDatastore</name>
<value>false</value>
</property>
<property>
<name>datanucleus.autoCreateSchema</name>
<value>true</value>
</property>
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
<property>
<name>datanucleus.autoCreateTables</name>
<value>true</value>
</property>
<property>
<name>datanucleus.autoCreateColumns</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
</configuration>
- Hive的MySQL配置
- 加载驱动程序
- 下载jdbc驱动:mysql-connector-java-5.1.49.tar.gz;
- 解压拷贝:
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
- 启动并登陆MySQL
- mysql -u root -p
- 新建hive数据库
- create database hive; # 与hive-site.xml中localhost:3306/hive的hive对应,用来保存hive元数据
- 配置Mysql允许hive接入
- create user ‘hive’@‘localhost’ identified by ‘hive’; # hive用户密码;
- GRANT ALL ON *.* TO ‘hive’@‘localhost’; # 将所有数据库的所有表的所有权限赋给hive用户;
- flush privileges; # 刷新mysql系统权限关系表;
- 启动hive
- 启动hdfs与yarn:start-dfs.sh、start-yarn.sh
- 启动hive
cd /usr/local/hive
./bin/schematool -dbType mysql -initSchema
./bin/hive
- 使用mysql作为元数据库时登陆启动Hive过程中,可能出现的错误和解决方案:
- java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument
- 原因:hive内依赖的guava.jar和hadoop内的版本不一致;
- 解决方法:
- 查看hadoop安装目录下share/hadoop/common/lib内guava.jar版本;
- 查看hive安装目录下lib内guava.jar的版本 如果两者不一致,删除版本低的,并拷贝高版本的,问题解决;
- org.datanucleus.store.rdbms.exceptions.MissingTableException: Required table missing : “VERSION” in Catalog “Schema”. DataNucleus requires this table to perform its persistence operations.
- 解决方法:进入hive安装目录(比如/usr/local/hive),执行如下命令
./bin/schematool -dbType mysql -initSchema
- Hive metastore database is not initialized
- 原因:以前曾经安装了Hive或MySQL,重新安装Hive和MySQL以后,导致版本、配置不一致
- 解决方法:使用schematool工具(Hive现在包含一个用于 Hive Metastore 架构操控的脱机工具,名为 schematool),此工具可用于初始化当前 Hive 版本的 Metastore 架构;此外,其还可处理从较旧版本到新版本的架构升级。故解决上述错误,在终端执行如下命令即可:
schematool -dbType mysql -initSchema
七、Hive编程实战
- 知识准备
- Hive的基本数据类型
- TINYINT:1 byte 有符号整数(1)
- SMALLINT:2 bytes 有符号整数(1)
- INT:4 bytes 有符号整数(1)
- BIGINT:8 bytes 有符号整数(1)
- FLOAT:4 bytes 单精度浮点数(1.0)
- DOUBLE:8 bytes 双精度浮点数(1.0)
- BOOLEAN:布尔类型,true or false(false)
- STRING:字符串,可指定字符集(“hive”)
- TIMESTAMP:整数、浮点数or字符串(1321123121)
- Hive的集合数据类型
- ARRAY:一组有序的字段,字段的类型必须相同;
- MAP:一组无序的键/值对,键的类型必须是原子的,值可以是任何数据类型,同一个映射的键和值额类型必须相同;
- STRUCT:一组命名的字段,字段类型可以不同
- Hive基本操作
- 创建数据库、表、视图
- 创建数据库:create database [if not exists] database_name;
- hive> create database if not exists college;
- 创建表(内部表、外部表以及分区表见附录):
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,...)];
- hive> use college;
- hive> create table if not exists student(id int,name string);
- 创建视图
- hive> create view stu as select id,name from student where id<10;
- 查看数据库、表
- 查看数据库
- 查看所有数据库
- hive> show databases;
- 查看以h开头的所有数据库
- hive> show databases like ‘col.*’
- 查看hive数据库位置等信息
- describe database hive;
- desc database hive;
- desc database extended hive;
- 查看表
- hive> show tables;
- hive> show tables in college like ‘s.*’;
- 修改数据库、表
- 修改数据库
- 用户可以使用
ALTER DATABASE
命令为某个数据库的DBPROPERTIES设置键-值对属性值,来描述这个数据库的属性信息,数据库的其它元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置 - Ex
- alter database hive set dbproperties(‘createtime’=‘20201122’);
- 修改表
- 重命名(RENAME)表
- alter table table_name rename to new_table_name
- 增加(ADD)/修改(CHANGE)/替换(REPLACE)列信息
- alter table table_name add columns (col dt); # 加到所有列后,但在partition列前
- alter table table_name change column col_name new_col_name data_type;
- alter table table_name replace columns (col_a dt,col_b dt,…); # 替换整个表的列
- 删除数据库、表
- 删除数据库
- drop database db [cascade]; # 非空数据库使用cascade,否则报错
- 删除表
- drop table table_name;
- 向表中装载数据
- 装载本地数据
- hive> load data local inpath ‘/home/hadoop/stu.txt’ overwrite into table student; # overwrite 覆盖
- 与下述语句等同(load本地数据本质即为上传本地数据到hive数据表存放路径)
- hadoop fs -put /home/hadoop/stu.txt /hive/warehouse/college.db/student
- 装载hdfs数据
- hive> load data inpath ‘/user/hadoop/stu.txt’ overwrite into table student; # overwrite 覆盖
- 向表中插入数据
- insert (overwrite) table student_copy select * from student where id<10;
- 从查询表中数据
- 使用select…from…where…等语句,并结合关键字group by、having、like等操作;
- case…when…then…
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);
- 数据类型转换
- 隐式转换规则
- 任何整数类型都可以隐式的转换为一个范围更广的类型:TINYINTINT、INTBIGINT等;
- 所有整数类型、FLOAT和STRING类型(string like “12.1” but not “abc123”)都可以隐式地转换成DOUBLE;
- TINYINT、SMALLINT、INT都可以转换为FLOAT;
- BOOLEAN类型不可以转换为任何其它的类型;
- 显示转换
- CAST操作:
- cast(“1” as int)
- cast(“abc123” as int)
- 实战一:创建person表并把下述数据文件内容载入person表;
jack,mary_tom,jackson:18_jackcon:19,NC_JX
tom,jack_frank,tomsom:21_tomson:16,SY_LN
- 创建person表
- 载入并查询数据
- 其它
- 实战二:Word Count,统计单词出现的次数,共三个文件fileA.txt、fileB.txt、fileC.txt,内容分别为“hello world”,“hello hadoop”,“hello hive”;
- create table docs(line string);
load data local inpath ‘/home/hadoop/input’ overwrite into table docs; - create table word_count as
select word,count(1) as count from
(select explode(split(line,’ ')) as word from docs) w
group by word
order by word; - select * from word_count;
附一:管理表(内部表)
默认创建的表都是所谓的管理表,有时也被称为内部表,因为这种表,Hive会或多或少地控制着数据的生命周期。Hive默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse/dir所定义的目录或其子目录下。当我们删除一个管理表时,Hive也会删除这个表中的数据。管理表不适合和其它工具共享数据。
附二:外部表
Hive创建外部表时,仅记录数据所在的路径,不会对数据的位置做任何改变。外部表与内部表的主要区别在于删除外部表时,Hive不会删除这个表中的数据,重新创建该表仍然可以查到该数据(Mysql的元数据与Hdfs的原数据缺失任何一个都不能查询到该表的数据,且它们数据的先后,即先有元数据或先有原数据,不影响表数据的查询;Hive删除外部表只是删除元数据,但删除内部表会删除元数据与原数据)。
管理表与外部表的的互相转换:
- 查询表的类型:desc formatted student;
- 修改表为内部表or外部表:
- alter table student set tblproperties(‘EXTERNAL’=‘FALSE’);
- alter table student set tblproperties(‘EXTERNAL’=‘TRUE’)
注:‘EXTERNAL’='FALSE’必须大写;
附三:分区表
分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句的表达式选择查询所需要的指定的分区能够提高查询效率(避免全表扫描)。
分区表基本操作
- 创建分区表
- 载入数据
- 不指定分区,会报错(FAILED)或创建默认分区(依赖于hive版本),本人hive版本为3.1.2,创建的是默认分区(下图)
- 指定分区
- 查询数据
- 非全表扫描
- 增加分区(添加多个分区,空格隔开)
- 删除分区(删除多个分区,逗号隔开)
- 查看分区
- 查看表分区信息
- 创建二级分区
- 载入数据:略
- HDFS创建分区目录并上传数据如何通过select查询到(即需要添加元数据信息)
- 修复:rsck repair table partition_table_name;
- 以该分区目录添加分区;
- 载入数据到分区目录;
附四:Hive SQL 查询函数手册
- 聚合计算
函数 | 功能说明 |
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<K,V>) | 返回Map的大小 |
size(Array) | 返回Array的大小 |
map_keys(Map<K,V>) | 返回Map的key集合 |
map_values(Map<K,V>) | 返回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 |
- 混合函数
- reflect(或java_method())调用java自带函数
select reflect("java.lang.String","Max",2,3);
select java_method("java.lang.String","Min",2,5);
- 虚表生成:略
- stack
- explode
- inline
- 其它
- 内置命令
- 查看所有函数:show functions
- 查看函数的用法:desc function fun_name
- 查看函数的用法与其它信息:desc function extended fun_name
- WITH AS
with
a as (select * from scott.emp),
b as (select * from scott.dept)
select * from a, b where a.deptno = b.deptno;
- UNION
- UNION 操作符合并的结果集,不允许重复值
- UNION ALL 允许有重复值
Source
Hadoop Course PPT and Word of NEU