由于从hdp3.1.0升级到3.1.4,我在hive中遇到了一些不了解的问题。注意,我只使用orc事务表。
例如,此查询:
with cte as (
select
e.id
, '{}' as json
from event e
)
-- select count(*) from cte
select
id
, lv.customfield
from cte
lateral view outer
json_tuple(cte.json, 'customfield') cv AS `customfield`
它在升级前工作得很好。
现在,即使cte返回一定数量的行,使用横向视图也只会从resultset中删除行,没有任何错误,而在cte之外没有额外的where子句(在我的真实示例中,查询返回66行,没有横向视图,但只有19行有横向视图)。
就我而言,我有: select count(*)
给我66排
当静态字符串上的横向视图被添加时,我只得到19行。
我尝试了很多变化:
如果我用静态cte替换事件表( select stack(1, ...)
)我有我期望的结果
如果我删除横向视图,我就得到了我期望的行数(只要我不使用
如果我创建并使用一个临时表而不是一个cte,结果不会改变。
如果我把 json_tuple(cte.json, 'customfield')
在cte之外的select部分(没有其他内容,因为它将是无效的),没有 lateral view
,我有预期的行数,
如果我使用 get_json_object
在cte外的选择部分(没有侧视图),我得到了预期的结果。
当然,配置单元(服务器或元存储)日志中没有任何内容。
顺便说一句,升级后 merge
语句[不断生成重复项][1],而它以前工作得非常好。
另一个非常令人惊讶的事情是,在cte中有一个if语句,例如: if(is_deleted is null, 'true', 'false')
. 如果我更换 is null
与 is not distinct from null
,这应该是完全有效的,cte不返回任何行。
我完全不知所措,我不知道为什么会这样,我怎么能相信Hive。
我无法通过生成手动数据来复制错误,因此我无法给出一个(非)工作示例。
1条答案
按热度按时间9njqaruj1#
我还不了解实际原因,但我可以隔离问题并提交错误报告:https://issues.apache.org/jira/browse/hive-22500
简而言之,如果涉及sort by(隐式或显式),那么lewer-than或equals with隐式字符串到timestamp的转换将失败。
您可以查看完整设置或其他示例的错误报告。解决方法是显式地将字符串转换为时间戳。