Hadoop学习(十)——HiveQL查询

本文介绍了SQL查询的基本语法,包括使用SELECT从数据库表中选择特定列,如name和salary,以及如何处理数组、映射和结构数据。还详细讲解了正则表达式、计算、函数(如round、exp、log)和聚合函数(如count、avg、min),以及LIMIT、CASE...WHEN...THEN语句,WHERE和JOIN子句的用法。此外,提到了表生成函数、数据类型转换和抽样查询等高级特性。
摘要由CSDN通过智能技术生成

SELECT...FROM...语句

FROM子句标识从哪个表、视图或嵌套中选择记录

SELECT指定要保存的列及输出函数要调用的一个或多个列

# 查询employees表的name和salary字段内容
SELECT name, salary FROM employees;

SELECT e.name, e.salary FROM employees as e;
# subordinates列是一个数组
# 引用其数据元素(引用第一个元素的查询)
# 引用一个不存在的元素将会返回NULL
# 同时提取出的String类型的值将不会加引号
SELECT name, subordinates[0] FROM employees;
# 引用MAP元素
# deductions是MAP类型,使用键值形式
SELECT name, deductions["State Taxes"] FROM empoyees;
# struct 也是使用MAP形式
SELECT name, address.city FROM employees;

使用正则

# 使用正则表达式选择想要的列
# 从stocks中选择symbol列和所有列名以price作为前缀的列
SELECT symbol, `price.*` FROM stocks;

使用列值进行计算

# 查询,转换为大写的雇员姓名,雇员对应的薪水,需要缴纳的税收比,税后薪资
SELECT upper(name), salary, seductions["Federal Taxes"], round(salary * (1 - deductions["Federal Taxes"])) FROM employees;

算术运算符

+     -     *     、     %(求余)     &(按位与)    |(按位或)     ^(按位异或)   ~(按位取反)

使用函数

返回值类型函数描述
BIGINTround()  返回一个double类型的最近整数
DOUBLEround(double d, int n)  返回double类型,保留n位小数的近似值
BIGINGfloor(DOUBLE d)返回  \leqslant d 的最大的BIGINT型值 
BIGINT

ceil(DOUBLE d)

ceiling(DOUBLE d)

返回 \geqslant d 的最小的BIGINT型值
DOUBLE

rand()

rand(INT seed)

每行返回一个double型随机数,整数seed是随机因子
DOUBLEexp(DOUBLE d)返回 e 的 d 次幂
DOUBLEln(DOUBLE d)以自然对数为底的 d 的对数
DOUBLElog10(DOUBLE d)以10为底的 d 的对数
DOUBLElog(DOUBLE base, DOUBLE d)以base 为底的 d 的对数
DOUBLE

pow(DOUBLE d, DOUBLE p)

power(DOUBLE d, DOUBLE p)

计算 d 的 p 次幂
DOUBLEsqrt(DOUBLE d)计算 d 的平方根
STRINGbin(DOUBLE i)计算二进制值 i 的STRING类型值
STRINGhex(BIGINT i)计算十六进制值 i 的STRING类型值
STRINGhex(STRING str)计算十六进制
STRINGhex(BINARY b)计算二进制表达值 b 的STRING类型值
STRINGunhex(STRING i)hex(STRING str)的逆方法
STRINGconv(BIGINT num, INT from_base, INT to_base)将BIGINT类型的num 从from_base转换成to_base进制
DOUBLEabs(DOUBLE d)计算DOUBLE型值 d 的绝对值
INTpmod(INT i1,INT i2)i1对 i2 取模
DOUBLEpmod(DOUBLE d1, DOUBLE d2)d1对d2取模
DOUBLEsin(DOUBLE d)返回正弦值
DOUBLEdefress(DOUBLE d)转换成角度值
DOUBLEradians(DOUBEL d)转换成弧度值
INTpositive(INT i )返回 i
INTnegative(INT i)返回 i 的负数
FLOATsign(DOUBLE d)d 正数,返回1.0;负数返回-1.0,否则返回0.0
DOUBLEe()数学常数e ,超越数
DOUBLEpi()圆周率 pi

聚合函数

count        计算有多少行数据

avf                返回指定列的平均值

【加上DISTINCT,计算的都是排重后的值】

# 示例
SELECT count(*), avg(salary) FROM employees;
返回的值类型函数描述
BIGINTcount(*)计算总行数
DOUBLE

sum(col)

sum(DISTINCT col)

计算(排重)值的和
DOUBLE

avg(col)

avg(DISTINCT col)

计算均值
DOUBLE

min(col)

max(col)

计算指定行最小值、最大值
DOUBLE

variance(col)

var_pop(col)

返回集合col中一组数值的方差
DOUBLEvar_samp(col)返回集合col中的一组数值样本方差
DOUBLEstddev_pop(col)返回一组数值的标准偏差 
DOUBLEcovar_pop(col1,col2)返回一组数值的协方差
DOUBLEcovar_samp(col1,col2)返回一组数值的样本协方差
DOUBLEcorr(col1,col2)返回两组数值的相关系数
DOUBLEpercentile(BIGINT int_expr,p)int_expr在p(范围[0:1])处对应的百分比
ARRAY<DOUBLE>percentile(BIGINT int_expr, ARRAY(P1[,P2]...))int_expr在p(DOUBLE型数组,范围[0:1])处对应的百分比
DOUBLEpercentile_approx(DOUBLE col,p[,NB])col在p处对应的百分比,NB是用于估计直方图中的仓库数量
ARRAY<STRUCT{'x', 'y'}>histgram_numeric(col,NB)返回NB数量的直方图仓库数组,返回结果中的值x是中心,值y 是仓库的高
ARRAYcollect_set(col)返回集合col元素排重后的数组

【通常,可以将属性hive.map.aggr的值设置为true来提高聚合的性能】

表生成函数

可以将单列扩展为多列或多行

# 将employees表中每行记录中的subordinates字段内容转换为0个或多个新的记录行,若某行雇员记录该字段为空,则不产生新的记录;不为空,则每个元素都产生一行新纪录。
SELECT explod(subordinates) AS sub FROM employees;
SELECT parse_url_tuple(url, 'HOSt', 'PATH', 'QUERY') as (host, path, query)
FROM url_table;

表生成函数

返回值类型函数描述
N行结果explode(ARRAY array)返回0到多行结果,每行都对应输入的array数组中的一个元素
N行结果explode(MAP map)返回0到多行结果,每行对应每个map键值对,一个字段是map的键,另一个字段对应map值
TUPLEjson_tuple(STRING jsonStr,p1,p2,...,pn)接受多个标签名称,对输入的JSON字符串进行处理,一次调用就能获得多个键值
TUPLEparse_url_tuple(url, partname1, partname2,...,partnameN)从URL解析出N个部分信息
N行结果stack(INT n, col1,...,colM)把M列转换成N行,每行有M/N个字段

其他内置函数

 

 

 

LIMIT语句 

限制典型查询返回的行数

# 查询,转换为大写的雇员姓名,雇员对应的薪水,需要缴纳的税收比,税后薪资
# 返回两条数据
SELECT upper(name), salary, seductions["Federal Taxes"], round(salary * (1 - deductions["Federal Taxes"])) FROM employees
LIMIT 2;

设置列别名

# 查询,转换为大写的雇员姓名,雇员对应的薪水,需要缴纳的税收比,税后薪资
SELECT upper(name), salary, seductions["Federal Taxes"] as fed_taxes, 
round(salary * (1 - deductions["Federal Taxes"])) as salary_minus_fed_taxes
FROM employees;

 嵌套使用SELECT语句

# 给前面的结果集起了名字,叫e 
FROM (
    SELECT upper(name), salary, seductions["Federal Taxes"] as fed_taxes,
    round(salary * (1 - deductions["Federal Taxes"])) as salary_minus_fed_taxes
    FROM employees) e
SELECT e.name, e.salary_minus_fed_taxes
WHERE e.salary_minus_fed_taxes > 70000;

CASE...WHEN...THEN语句

类似if条件语句,用于处理单个列的查询结果

SELECT name, salary,
CASE
    WHEN salary < 50000.0 THEN 'low'
    WHEN salary >= 50000.0 AND salary <= 70000.0 THEN 'middle'
    WHEN salary >= 70000.0 AND salary <= 100000.0 THEN 'high'
    ELSE 'very high'
END AS bracket FROM employees;

WHERE 语句

过滤条件

使用谓词表达式,用 AND 或 OR 连接

不能在WHERE子句中使用列别名

但可以嵌套一个SELECT查询进行使用

# 错误
SELECT upper(name), salary, seductions["Federal Taxes"] as fed_taxes,
    round(salary * (1 - deductions["Federal Taxes"])) as salary_minus_fed_taxes
    FROM employees
    WHERE round(salary_minus_fed_taxes) > 70000;


# 正确
FROM (
    SELECT upper(name), salary, seductions["Federal Taxes"] as fed_taxes,
    round(salary * (1 - deductions["Federal Taxes"])) as salary_minus_fed_taxes
    FROM employees) e
SELECT e.name, e.salary_minus_fed_taxes
WHERE e.salary_minus_fed_taxes > 70000;

# 正确2
SELECT e.* FROM 
    (SELECT upper(name), salary, seductions["Federal Taxes"] as fed_taxes,
    round(salary * (1 - deductions["Federal Taxes"])) as salary_minus_fed_taxes
    FROM employees) e
    WHERE round(e.salary_minus_fed_taxes) > 70000;

谓词操作符

操作符支持的数据类型描述
A=B基本数据类型若A=B,返回True
A<=>B基本数据类型若A和B都为NULL,返回TRUE
A==B没有SQL中使用=,不使用==

A<>B

A!=B

基本数据类型

A或B为NULL,返回NULL

A和B不相等返回True

A<B基本数据类型

A或B为NULL,返回NULL

A 小于B返回True

A <= B基本数据类型

A或B为NULL,返回NULL

A 小于等于B 

A > B基本数据类型A或B为NULL,返回NULL
A>=B基本数据类型A或B为NULL,返回NULL
A [NOT] BETWEEN B AND C基本数据类型A、B、C任一为NULL,返回NULL
A IS [NOT] NULL所有数据类型
A [NOT] LIKE BSTRINGB是一个SQL下的简单正则表达式

A  RLIKE  B

A  REGEXP  B

STRINGB是一个正则表达式

关于浮点数的比较

从TEXTFILE文本文件中读取数据的话:表模式中对应字段类型定义为DOUBLE

使用cast操作符,将类型显式指定为FLOAT。   cast(0.2   AS  FLOAT)

LIKE和RLIKE

LIKE后面跟着的是简单的正则匹配,有三种格式

%xxx        匹配以xxx结尾的

xxx%        匹配以xxx开头的

%xxx%     匹配包含xxx的

RLIKE后面跟着的是类似Python中的正则匹配,用到.  *  |等符号

# 使用多个LIKE子句进行过滤
SELECT name, address FORM employees WHERE address.street LIKE '%Chicago%' OR address.street LIKE '%Ontario%';

GROUP BY 子句

通常和聚合函数一起使用,按照一个或多个列对结果进行分组,然后对每个组执行聚合操作

# 按照苹果公司股票年份对股票记录进行分组,然后计算每年平均收盘价
SELECT year(ymd), avg(price_close) FROM stocks WHERE exchange='NASDAQ' AND symbol='AAPL'
GROUP BY year(ymd);

HAVING语句

# 按照苹果公司股票年份对股票记录进行分组,然后计算每年平均收盘价
SELECT year(ymd), avg(price_close) FROM stocks WHERE exchange='NASDAQ' AND symbol='AAPL'
GROUP BY year(ymd);



# 限制输出结果中年平均收盘价要大于$50
SELECT year(ymd), avg(price_close) FROM stocks WHERE exchange='NASDAQ' AND symbol='AAPL'
GROUP BY year(ymd)
HAVING avg(price_close) > 50;

JOIN语句

【Hive不支持在ON子句中的谓词之间使用OR,不能实现非等值连接】

内连接(INNER JOIN),只有进行连接的两个表中都存在与连接标准相互匹配的数据才会被保留下来;

# 连接条件是ymd字段相等,也称为链接关键字
# ON 子句指定连接的条件
SELECT a.ymd, a.price_close, b.price_close
FROM stocks a JOIN stocks b ON a.ymd = b.ymd
WHERE a.symbol='APPL' AND b.symbol='IBM';
# 字段ymd和字段symbol作为等值连接键的内连接(INNER JOIN)
SESLECT s.ymd, s.symbol, s.pricr_close, d.diivdend
FROM stock s 
JOIN dicidends d 
ON s.ymd=d.ymd AND s.symbol=d.symbol
WHERE s.symbol='APPL';

# 3个表做内连接
SELECT a.ymd, a.price_close, b.price_close, c.price_close
FROM stocks a JOIN stocks b ON a.ymd=b.ymd JOIN stocks c ON a.ymd=c.ymd
WHERE a.symbol='APPL' AND b.symbol='IBM' AND c.symbol='GE';

JOIN优化

3个以上的表进行JOIN连接时,若每个ON子句都使用相同的连接 键,则只会产生一个MapReduce job

Hive假定最后的表是最大的表,写查询时,从左到右表的大小依次增大

# "标记"机制,告诉查询器哪个表是大表
SELECT /*+STREAMTABLE(s)*/ s.ymd, s.symbol,s.price_close, d.dividend
FROM stocks s JOIN dividends d ON s.ymd=d.ymd AND s.symbol=d.symbol
WHERE s.symbol='APPLE';

LEFT OUTER JOIN

左外连接通过关键字LEFTOUTER进行标识

JOIN操作符左边表中符合WHERE子句的所有记录将被返回,右边表中没有符合条件的记录时,指定的选择列会是NULL

# 字段ymd和字段symbol作为等值连接键的内连接(LEFT OUTER JOIN)
SESLECT s.ymd, s.symbol, s.pricr_close, d.diivdend
FROM stock s 
LEFT OUTER JOIN dicidends d 
ON s.ymd=d.ymd AND s.symbol=d.symbol
WHERE s.symbol='APPL';

OUTER JOIN

SESLECT s.ymd, s.symbol, s.pricr_close, d.diivdend
FROM stock s 
LEFT OUTER JOIN dicidends d 
ON s.ymd=d.ymd AND s.symbol=d.symbol
WHERE s.symbol='APPL' and s.exchange='NASDAQ';

【WHERE语句在连接操作执行之后才会执行,因此WHERE语句只用于过滤那些非NULL值的列值

ON语句中的分区过滤条件在外连接中是无效的】

RIGHT OUTER JOIN

返回右边表中所有符合WHERE语句的记录,左表中匹配不上的用NULL代替

SESLECT s.ymd, s.symbol, s.pricr_close, d.diivdend
FROM dicidends d
RIGHT OUTER JOIN stock s 
ON d.ymd=s.ymd AND d.symbol=s.symbol
WHERE s.symbol='APPL';

FULL OUTER JOIN

返回所有表中符合WHERE语句的所有记录

SESLECT s.ymd, s.symbol, s.pricr_close, d.diivdend
FROM dicidends d
FULL OUTER JOIN stock s 
ON d.ymd=s.ymd AND d.symbol=s.symbol
WHERE s.symbol='APPL';

LEFT SEMI-JOIN

左半开连接,返回左边表的记录

不支持右半开连接

对左表中一条指定的记录,右表中一旦匹配,就立即停止扫描

笛卡尔积JOIN

表示左边表的行数乘以右边表的行数等于笛卡尔积结果集的大小

map-side JOIN

只有一张表是小表的时候,在最大的表通过mapper时将小表完全放到内存中

或是设置hive.suto.convert.JOIN的属性值,默认为false

右外连接和全外连接不支持这个优化

SELECT /*+MAPJOIN(d)*/s.ymd, s.symbol,s.price_close, d.dividend
FROM stocks s JOIN dividends d ON s.ymd=d.ymd AND s.symbol=d.symbol
WHERE s.symbol='APPLE';

ORDER BY和SORT BY

ASC升序,DESC降序

# 集体,耗时多
SELECT s.ymd, s.symbol, s.price_close
FROM stocks s
ORDER BY s.ymd ASC, s.symbol DESC;
# 分布,多个reducer
SELECT s.ymd, s.symbol, s.price_close
FROM stocks s
SORT BY s.ymd ASC, s.symbol DESC;

含有SORT BY 的 DISTRIBUTE BY

DISTRIBUTE BY控制map的输出在reducer中如何划分

写在ORDER BY 之前

SELECT s.ymd, s.symbol, s.price_close
FROM stocks s
DISTRIBUTE BY s.symbol
SORT BY s.ymd ASC, s.symbol DESC;

CLUSTER BY

# DISTRIBUTE BY 语句和DORT BY涉及的语句如果完全相同,就可以用以下进行简化
SELECT s.ymd, s.symbol, s.price_close
FROM stocks s
CLUSTER BY s.symbol;

类型转换

浮点数——>整数:使用round()或floor()函数,而非cast操作符

嵌套转换

# b的类型是BINARY,但b的值是数值
# 否则只能转换为STRING
SELECT (2.0*cast(cast(b as string) as double)) from src;

抽样查询

假设numbers表只有number字段,值是1-10

使用rand函数抽样,返回一个随机值

分桶语句中,分母表示数据将会被散列的桶的个数,分子表示将会选择的桶的个数

SELECT * FROM numbers TABLESAMPLE(BUCKET 3 OUT OF 10 ON rand()) s;

数据块抽样

基于行数,按照输入路径下的数据块百分比进行抽样

最小抽样单元是一个128MB的普通的HDFS的块

SELECT * FROM numbersflat TABLESAMPLE(0.1 PERCENT) s;

UNION ALL

将两个或多个表进行合并

每个union子查询需要有相同的列,对应的每个字段的字段类型必须一致

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.上传tar包 2.解压 tar -zxvf hive-1.2.1.tar.gz 3.安装mysql数据库 推荐yum 在线安装 4.配置hive (a)配置HIVE_HOME环境变量 vi conf/hive-env.sh 配置其中的$hadoop_home (b)配置元数据库信息 vi hive-site.xml 添加如下内容: javax.jdo.option.ConnectionURL jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true JDBC connect string for a JDBC metastore javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver Driver class name for a JDBC metastore javax.jdo.option.ConnectionUserName root username to use against metastore database javax.jdo.option.ConnectionPassword hadoop password to use against metastore database 5.安装hive和mysq完成后,将mysql的连接jar包拷贝到$HIVE_HOME/lib目录下 如果出现没有权限的问题,在mysql授权(在安装mysql的机器上执行) mysql -uroot -p #(执行下面的语句 *.*:所有库下的所有表 %:任何IP地址或主机都可以连接) GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; FLUSH PRIVILEGES; 6. Jline包版本不一致的问题,需要拷贝hive的lib目录中jline.2.12.jar的jar包替换掉hadoop中的 /home/hadoop/app/hadoop-2.6.4/share/hadoop/yarn/lib/jline-0.9.94.jar 启动hive bin/hive ---------------------------------------------------------------------------------------------------- Hive几种使用方式: 1.Hive交互shell bin/hive 2.Hive JDBC服务(参考java jdbc连接mysql) 3.hive启动为一个服务器,来对外提供服务 bin/hiveserver2 nohup bin/hiveserver2 1>/var/log/hiveserver.log 2>/var/log/hiveserver.err & 启动成功后,可以在别的节点上用beeline去连接 bin/beeline -u jdbc:hive2://mini1:10000 -n root 或者 bin/beeline ! connect jdbc:hive2://mini1:10000 4.Hive命令 hive -e ‘sql’ bin/hive -e 'select * from t_test'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值