1

由于从 hdp 3.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 返回一定数量的行,使用横向视图只会从结果集中删除行,没有任何错误,而 CTE 之外没有额外的 where 子句(在我的实际示例中,查询返回 66 行没有侧视图,但只有 19 个)。

就我而言,我有:

  • select count(*)给我66行
  • 当添加静态字符串的横向视图时,我只得到 19 行。

我尝试了很多变化:

  • 如果我用静态 CTE ( ) 替换事件表,select stack(1, ...)我会得到我期望的结果
  • 如果我删除横向视图,我有我期望的行数(只要我不使用不同)
  • 如果我创建并使用临时表而不是 CTE,则结果不会改变。
  • 如果我将json_tuple(cte.json, 'customfield')选择部分放在 CTE 之外(没有其他内容,因为它无效),没有lateral view,我有预期的行数,
  • 如果我get_json_object在 CTE 之外的选择部分中使用(并且没有侧视图),我会得到预期的结果。
  • 当然,配置单元(服务器或元存储)日志中没有任何内容。
  • 附带说明一下,自从升级以来,一个merge语句[不断生成重复项][1],而之前它工作得很好。

另一个非常令人惊讶的是,在 CTE 内部有一个 if 语句,例如:if(is_deleted is null, 'true', 'false'). 如果我替换应该完全有效的is nullwith ,CTE 不会返回任何行。is not distinct from null

我完全不知所措,我不知道为什么会发生这种情况,也不知道我怎么能相信蜂巢。 

我无法通过生成手动数据来复制错误,因此我无法给出(不)工作示例。

4

1 回答 1

0

我还不明白的实际原因,但我可以隔离问题并实际上可以提交错误报告:https ://issues.apache.org/jira/browse/HIVE-22500

简而言之,如果涉及(隐式或显式)排序,则小于或等于隐式字符串到时间戳的转换失败。

-- valid result
select count(*) from ( select * from opens where load_ts <= '2019-11-13 09:07:00') t;
-- invalid result
select count(*) from ( select * from opens where load_ts <= '2019-11-13 09:07:00' sort by id) t;

您可以查看完整设置或其他示例的错误报告。解决方法是将字符串显式转换为时间戳。

于 2019-11-18T19:14:41.503 回答