【问题标题】:Query is working on Impala but not on hiveQuery 正在 Impala 上工作,但不在 hive 上
【发布时间】:2020-10-05 21:35:23
【问题描述】:

以下查询在 Impala 上完美运行。

create table test1 stored as parquet as 
select bac_key, tu_analytic_key, 
  row_number() over (partition by bac_key order by min(rn)) as new_rownum 
from test2  
group by bac_key, tu_analytic_key order by bac_key, min(rn);

当我在 Hive 上运行它时,我收到以下错误。

错误:编译语句时出错: 失败:语义异常 [错误 10002]: 第 1:301 行无效的列引用“rn”

rn 是 test2 表中的一列。

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 如果我从 order by 子句中删除 min(rn),它在 hive 上执行得很好。但我需要按顺序排列的 min(rn)。

标签: sql hive impala


【解决方案1】:

如果是 Hive 不支持聚合函数的情况,您可以包装查询,然后在必要的列上使用 order by,如下所示。

create table test1 stored as parquet 
as 
    Select 
        bac_key
      , tu_analytic_key
      , new_rownum
      ,min_rn
      from
       (select 
            bac_key
          , tu_analytic_key
          , row_number() over (partition by bac_key order by min(rn)) as new_rownum
          , min(rn) As min_rn
        from test2 
           group by bac_key
         , tu_analytic_key) T
order by bac_key, min_rn;

Alter table test1 replace columns(bac_key string, tu_analytic_key string, new_rownum int);

【讨论】:

  • 嗨。我仍然得到同样的错误。错误:编译语句时出错:FAILED:SemanticException [错误 10004]:第 1:466 行无效的表别名或列引用“min_rn”:(可能的列名是:bac_key、tu_analytic_key、new_rownum)(状态=42000,代码=10004)
  • order by 子句无法从子查询中读取 min_rn 字段。请帮忙。谢谢。
  • 如果在外部选择中添加 min_rn 列会怎样?那它行得通吗?我知道您的表中不需要 min_rn,只是为了检查它是否有效。
  • 感谢您的回复。是的,如果我在外部选择中添加 min_rn,它会起作用。但正如你所说,我不需要表中的 min_rn。
  • 在上面编辑了我的答案。你可以做这样的事情。保留 min_rn 以便按工作顺序排列。然后使用 alter 语句从表中排除 min_rn 列。或者您可以使用所有列创建 test2,然后创建表 test1 作为 select col1, col2, col3 from test2;然后删除 test2。
猜你喜欢
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
相关资源
最近更新 更多