【问题标题】:Hive - SELECT inside WHEN clause of CASE function gives an errorHive - CASE 函数的 WHEN 子句中的 SELECT 给出错误
【发布时间】:2018-01-31 10:25:12
【问题描述】:

我正在尝试使用 Case 语句在 Hive 中编写一个查询,其中条件取决于当前行中的一个值(无论它是否等于其前身)。我想以这种方式动态评估它,因此需要嵌套查询,而不是先将其设为另一列并比较 2 列。 (我能够做到后者,但这确实是第二好的)。有谁知道如何使这项工作? 谢谢。

我的查询:

SELECT * ,
CASE 
    WHEN  
        (SELECT lag(field_with_duplicates,1)  over (order  by field_with_duplicates) FROM my_table b
        WHERE b.id=a.id)  =  a.field_with_duplicates
        THEN “Duplicate”
        ELSE “” 
END as Duplicate_Indicator
FROM my_table a


错误:

java.sql.SQLException: org.apache.spark.sql.AnalysisException: 无法识别表达式规范中 'SELECT' 'lag' '(' 附近的输入;第 4 行 pos 9

注意事项:

  • 我需要复杂的 'lag' 函数的原因是表中的唯一 ID 不是连续的,但我不认为这就是它所在的位置:我通过替换另一个更简单的内部查询进行测试并得到相同的错误消息.
  • 说到“重复”,我在发布之前确实搜索过这个问题,但我发现 CASE 中唯一的 SELECT 是在 THEN 语句中,如果它的工作原理相同,则表明我的也应该工作。

【问题讨论】:

  • 为什么要使用子查询?而不仅仅是CASE WHEN LAG(blah) OVER (blah) = a.field_with_duplicates THEN ...?
  • 我能说什么。你是对的。做到了。我不敢尝试,因为我认为我需要整个查询来匹配索引。感谢您的建议。

标签: sql hive hiveql nested-queries


【解决方案1】:

您不需要 CASE 中的子查询:

SELECT a.* ,
     CASE 
         WHEN  prev_field_with_duplicates = field_with_duplicates 
         THEN “Duplicate”
         ELSE “” 
     END as Duplicate_Indicator
FROM (select a.*,
             lag(field_with_duplicates,1)  over (order  by field_with_duplicates) as prev_field_with_duplicates 
        from my_table a
     )a

或者你甚至可以在 CASE 中使用 lag() 代替子查询(我不确定它是否适用于所有 Hive 版本):

 CASE 
     WHEN  lag(field_with_duplicates,1)  over (order  by field_with_duplicates) = field_with_duplicates 
     THEN “Duplicate”
     ELSE “” 
 END as Duplicate_Indicator

【讨论】:

  • 是的,后者是我所做的。谢谢。
【解决方案2】:

感谢@MatBailie 在他的评论中的回答。我不觉得很傻吗...
解决了

【讨论】:

    猜你喜欢
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 2012-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多