为有分区的表创建视图时,遇到的有趣的现象

sprays 2017-11-24 04:59:43
有两张结构相似的业务订单表,分别记录上海和北京分公司的数据,每次取数都要union一下很麻烦,所以想建视图将两张表union起来。两张源表都有增量更新的分区d,取数时只需取分区d=今天的数据。

我先建了如下视图。得让用户分辨每笔订单来自哪张源表吧,所以加了一个OS字段。
use XXX_DB;
drop view if exists xxx_test;
create view xxx_test (
OS comment '订单系统',
OrderID comment '订单号'
)
comment 'XXX'
as
select
'shanghai' as OS,
OrderID
from 订单表1
where d = from_unixTime(unix_Timestamp(),'yyyy-MM-dd')

union all
select
'beijing' as OS,
OrderID
from 订单表2
where d = from_unixTime(unix_Timestamp(),'yyyy-MM-dd')


基本就可以正常使用了。
但偶然发现:如果查询视图时写了where OS='shanghai',就会报错 No partition predicate found for Alias(似乎只有这样会引发报错场景)。这是没有指定分区的报错,但视图里明明指定了啊。而且分区和OS有什么关系,为什么偏偏在where OS时才报分区的错?

解决方案1:既然说我没指定分区,那在查询视图时加上
set hive.mapred.mode = nonstrict;

总行了吧。实测的确可行。但这给使用视图平添了麻烦啊。

解决方案2:OS的唯一的与众不同之处,在于它是额外添加的静态值字段,因此就受到“歧视”了?但我真的需要OS这个标记啊,于是想基于源表里的某个字段写一个表达式,只要最后恒输出'shanghai'/'beijing'就行了。试了如下3种写法:(背景:OrderID总是大于0的)
case when OrderID > 0 then 'shanghai' else 'shanghai' end as OS,
case when 1 = 1 then 'shanghai' else OrderID end as OS,
case when OrderID > 0 then 'shanghai' else OrderID end as OS,

结果是前两种仍然会报错,第三种写法成功了。看来系统还挺机灵的,如果表达式写得不够隐蔽,让系统识别出表达式恒等于某个静态值,就依然没戏。

问题是解决了,想问下为什么hive会有这种对静态值的“歧视”呢?有大神能解释下内部的机理吗?
...全文
542 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
frankzx 2018-01-01
  • 打赏
  • 举报
回复
学习了,竟然还有这种情况,没遇到过。继续关注,等大神来解答

20,808

社区成员

发帖
与我相关
我的任务
社区描述
Hadoop生态大数据交流社区,致力于有Hadoop,hive,Spark,Hbase,Flink,ClickHouse,Kafka,数据仓库,大数据集群运维技术分享和交流等。致力于收集优质的博客
社区管理员
  • 分布式计算/Hadoop社区
  • 涤生大数据
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧