虚拟机中的Hive(1.2.1)不会报错不过的版本

前言
上篇博客入门篇(十九)介绍的JOIN语句是将多个表的列 ‘横向合并’,本篇要介绍的UNION ALL语句则是将多个表的列纵向合并,相当于将多个表的数据直接摞在一起,下面我们来详细介绍UNION ALL语句的用法。

  1. 语法
    1.1 Hive1.2.0后的语法
    Hive1.2.0之后版本的语法如下:

SELECT * FROM a

UNION [ALL]

SELECT * FROM b

UNION [ALL]

SELECT * FROM c

[]中的ALL是可选项,使用UNION时会对最后合并的数据进行去重,使用UNION ALL则只合并不去重。

但是!

我至今没有见过公司使用Hive1.2.0之后的版本……常见的Hive版本在0.13.0之后,1.1.0之前。

1.2 Hive0.13.0到1.1.0的语法
语法如下:

SELECT * FROM a

UNION ALL

SELECT * FROM b

UNION ALL

SELECT * FROM c

也就是说目前在绝大多数公司的Hive中只支持UNION ALL,不支持去重的UNION操作,想要去重需要自己使用子查询,套一层使用DISTINCT或者GROUP BY进行去重。

在0.13.0之后所有的版本中UNION ALL既可以在顶级查询中使用,也可以在子查询中使用。

而在0.13.0之前的版本,也就是从0.12.0往前,UNION ALL都只能在子查询中使用,否则会报错。

1.3 Hive0.12.0前的语法
语法如下:

​SELECT *
FROM(
SELECT * FROM a

 UNION ALL
 
 SELECT * FROM b
 
 UNION ALL
 
 SELECT * FROM c 
 …
)

1.4 使用注意事项
不管是哪个版本,使用的注意事项是相同的。

需要保证select中字段须一致,每个select语句返回的列的数量和名字必须一样,否则会报错。在1.2.1后的版本中对应列名不一致也不报错,例如我提供的虚拟机中的Hive……但仍然建议列名保持一致;
ORDER BY、CLUSTER BY、DISTRIBUTE BY、SORT BY、LIMIT这些语句不能在UNION ALL中单独的查询中使用,前四个排序语句必须括起来使用子查询后使用,LIMIT语句则可以先使用WITH AS语句在各自的查询中查好,最后再UNION ALL。例如下面的写法会报错:
SELECT * FROM a limit 1

UNION ALL

SELECT * FROM b limit 1

UNION ALL

SELECT * FROM c limit 1

3. Hive中有数据格式的隐式转换,所以不强制要求所有对应列的数据格式是相同的。
https://www.qichamao.com/person/63d1af3211f14176743acda70fc9cfd94757825ecf4f388ca8eb49c517d70c5966844cbda883f739391b0a911f83b7fd
https://www.qichamao.com/person/bd87757c7de9b5be3c39ad46c7559dfc1c34d985fd7d4e26b677d886f39780a1-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/2963ff7a9cb1540f366da63516a3f34b991a77dc36295d772395844aa4b13ce9-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/0e987948528756c1afee9f7ea8da1f07c0589c7bd36db5dc15c002540718f6b1-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/b904236f9d5729fa27ba61579f511e8b329f9cfce35b74c1260fa0a84cdb8848-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/40682472f576c25178a865b7bdeb344fd9d2ec53d091271f592d084475022162a3731adf703e32930386bb5b8276af92-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/da27a26f506a31fe8fa48513f8d7f4ad8f619b5fe785db0ed0287613d620102b-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/e3803492fad364f1d67305eaf6427fc9d4b31143857f5b12e7725d96e88cd9f6-2a6e52ffdd387b1510b9e27362ee9011
https://www.https?/www.qichamao.com/person/239dbdb3f74b6e08db59f79be0f6a6a68e9db998319c07d284004f4ba4257f532b83ef1fada89077d291fd879213e93d-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/05a3f943c781f23e021bda692dc4d01d64ff43ecc152af292d9e89a716dcac5d38e50b2b86488c7d78a5e72d46a30106-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/0db7d75ebc4e76b8afd323a04e374f1cd964f8a58e5e5e3fe528b6fb9c83dd11-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/cdcdcc0e7bfc4c5c15479b2198b3b3127fafe82b59c4b2414a002295be759aa1-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/88604e228a4339c037476fd8cf4a24656c0ded06e99ddb24578e5d8228255c96-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/a1b1a394f3381f9b54b77a214eeb379406814434cd32cfe9daaf9a0d9c88622c-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/b925a41044ecff8d51403e03f9e5f68f36fa9194cb8750933dc24c7c24083c8b-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/2f0cb8085f19808ba27041e4657206e23a94de857aa7906fc2d825177bcc04ec-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/cf9e5e16c3764f2c81e50b815306571b7803092ca8d6e5674478ce5b9a117df3-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/d4c02a82f8c9c70ce9f45baffc52541c98e4b5a79557b75489a3f3e2e71c8f3c-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/380206306e791312c7d7eef8fa7d07477ee0d098b62a0fea1a6af4e5c3af5c00-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/d82f75ac13bf68f2ff1771772fbd1fbd9f4b30d00b8ba7670ff9d79193fe7305-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/0aad86903d585dd66c389993233c127b4c9c3cfa6943ed2566c9716fc66d54a0-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/d36e6e43ac2461ba643d0f14fda8f6c7a21024825a2c8c0a1fb05d84aa1bf6de-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/62a2e63af92d3fff20501f64192d9bebea527963812d40af88f18679377e78b4-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/98b3b301e922bb3c93f97103bbe08accde60e7056c96fd4daeb7449813f31fb0-2a6e52ffdd387b1510b9e27362ee9011
https://www.qichamao.com/person/2eca6200f6c3b74c46d5e8691dbfe7ab39bb6d7acdac9f961273ee7532de2ac4-2a6e52ffdd387b1510b9e27362ee9011

2 举例
2.1 注意事项1举例
UNION ALL时字段数量如果不一样,会报错,这里我们自定义两个字段num1、num2进行演示:

WITH a
AS (
SELECT 1 num1
FROM app.t_od_use_cnt
WHERE date_8 = 20190101 LIMIT 1
)
,b
AS (
SELECT 1 num1
,2 num2
FROM app.t_od_use_cnt
WHERE date_8 = 20190101 LIMIT 1
)
SELECT *
FROM a

UNION ALL

SELECT *
FROM b;
运行报错如下:

FAILED: SemanticException Schema of both sides of union should match.

UNION ALL时对应的列名如果不一样,1.2.1前的版本会报错,这里我们自定义字段num1、num2、num3进行演示:
https://blog.csdn.net/sturgsslecofwe/article/details/97927443
https://blog.csdn.net/sturgsslecofwe/article/details/97937891
https://blog.csdn.net/sturgsslecofwe/article/details/97938152

WITH a
AS (
SELECT 1 num1
,2 num2
FROM app.t_od_use_cnt
WHERE date_8 = 20190101 limit 1
)
,b
AS (
SELECT 1 num1
,3 num3
FROM app.t_od_use_cnt
WHERE date_8 = 20190101 limit 1
)
SELECT *
FROM a

UNION ALL

SELECT *
FROM b;
我提供的虚拟机中的Hive(1.2.1)不会报错,不过因为公司的版本一般都比较老,So这样的写法在工作中的环境报错如下:

FAILED: SemanticException 19:5 Schema of both sides of union should match. _u1-subquery2 does not have the field num2. Error encountered near token ‘b’

所以还是强烈建议直接将列名改为一致,如下:

WITH a
AS (
SELECT 1 num1
,2 num2
FROM app.t_od_use_cnt
WHERE date_8 = 20190101 limit 1
)
,b
AS (
SELECT 1 num1
,3 num2
FROM app.t_od_use_cnt
WHERE date_8 = 20190101 limit 1
)
SELECT *
FROM a

UNION ALL

SELECT *
FROM b;

2.2 注意事项2举例
分别查询表t_od_use_cnt中的20190101、20190102、20190103三天的一条记录,使用UNION ALL将三条记录合并。

SELECT *
FROM app.t_od_use_cnt
WHERE date_8 = 20190101 limit 1

UNION ALL

SELECT *
FROM app.t_od_use_cnt
WHERE date_8 = 20190101 limit 1

UNION ALL

SELECT *
FROM app.t_od_use_cnt
WHERE date_8 = 20190101 limit 1;
这种写法违反了上面的第二条注意事项,报错如下:

FAILED: ParseException line 11:0 Failed to recognize predicate ‘UNION’. Failed rule: ‘orderByClause clusterByClause distributeByClause sortByClause limitClause can only be applied to the whole union.’ in statement

正确的写法如下:

WITH a
AS (
SELECT *
FROM app.t_od_use_cnt
WHERE date_8 = 20190101 limit 1
)
,b
AS (
SELECT *
FROM app.t_od_use_cnt
WHERE date_8 = 20190102 limit 1
)
,c
AS (
SELECT *
FROM app.t_od_use_cnt
WHERE date_8 = 20190103 limit 1
)
SELECT * FROM a

UNION ALL

SELECT * FROM b

UNION ALL

SELECT * FROM c;
运行结果如下:

_u1.platform _u1.app_version _u1.user_id _u1.use_cnt _u1.is_active _u1.date_8
1 1.5 10000 6 1 20190101
1 1.4 10200 46 1 20190102


作者:风影楼前
来源:CSDN
原文:https://blog.csdn.net/qq_23897391/article/details/92803543
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值