关于Hive中case when不准使用子查询的解决方法

在公司用Hive实现个规则的时候,遇到了要查询某个字段是否在另一张表中,大概情况就是

A表:

id value1 value2
1 100 0
2 101 1
3 102 1

B表:

value1
100
102
104

我要查询A表中当value2为0的时候直接输出0,为1的时候,判断value1是否在B表的value1中,如果在那么便输出0,不在便输出1,拿到第一反映是:

select
case
when value2 = 0 then 0
when value2 = 1 then
    case
    when value1 in (select value1 from B) then 0
    else 1
    end
end as value3
from A 

结果Hive就报错了

Error: Error while compiling statement: FAILED: SemanticException Line 0:-1 Unsupported SubQuery Expression ‘value1‘: Currently SubQuery expressions are only allowed as Where Clause predicates.

大概意思就是:目前的子查询表达式只允许为Where条件谓词

于是我们就必须将其改为使用left join来解决。

select
case
when a.value2 = 0 then 0
when a.value2 = 1 then
    case when
    b.value1 is not null then 0
    else 1
    END
END as value3
from A a
left join
B b
on a.value1 = b.value1;

大功告成,对了,使用的Hive版本为1.1.0

原文地址:https://www.cnblogs.com/harrylyx/p/12236441.html

时间: 2024-10-11 14:46:09

关于Hive中case when不准使用子查询的解决方法的相关文章

[转]Oracle DB 使用子查询来解决查询

? 定义子查询 ? 描述子查询可以解决的问题类型 ? 列出子查询的类型 ? 编写单行和多行子查询 ? 子查询:类型.语法和准则 ? 单行子查询: – 子查询中的组函数 – 带有子查询的HAVING子句 ? 多行子查询 – 使用ALL或ANY运算符 ? 使用EXISTS运算符 ? 子查询中的空值 使用子查询解决问题 谁的薪金高于Abel 的薪金? 子查询: Abel 的薪金是多少? 主查询: 哪些雇员的薪金高于Abel 的薪金? 使用子查询解决问题 假设要编写一个查询来找出谁的薪金高于Abel 的

Oracle DB 使用子查询来解决查询

? 定义子查询 ? 描述子查询可以解决的问题类型 ? 列出子查询的类型 ? 编写单行和多行子查询 ? 子查询:类型.语法和准则 ? 单行子查询: – 子查询中的组函数 – 带有子查询的HAVING子句 ? 多行子查询 – 使用ALL或ANY运算符 ? 使用EXISTS运算符 ? 子查询中的空值 使用子查询解决问题 谁的薪金高于Abel 的薪金? 子查询: Abel 的薪金是多少? 主查询: 哪些雇员的薪金高于Abel 的薪金? 使用子查询解决问题 假设要编写一个查询来找出谁的薪金高于Abel 的

universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法

在listview/gridview中使用UIL来display每个item的图片,当图片数量较多需要滑动滚动时会出现卡顿,而且加载过的图片再次上翻后依然会重复加载(显示设置好的加载中图片) 最近在使用UIL遇到了这个问题,相信这个问题许多使用UIL的人都碰到过 现在把解决方法贴出来给有同样问题的朋友做参考 先看下UIL的工作流程 在已经允许内存,存储卡缓存的前提下,当一个图片被请求display时,首先要判断图片是否缓存在内存中,如果false则尝试从存储卡读取,如果依然不存在最后才从网络地址

jQuery中ajax的使用与缓存问题的解决方法

jQuery中ajax的使用与缓存问题的解决方法 1:GET访问 浏览器 认为 是等幂的就是 一个相同的URL 只有一个结果[相同是指 整个URL字符串完全匹配]所以 第二次访问的时候 如果 URL字符串没变化 浏览器是 直接拿出了第一次访问的结果 POST则 认为是一个 变动性 访问 (浏览器 认为 POST的提交 必定是 有改变的) 防止 GET 的 等幂 访问 就在URL后面加上 ?+new Date();,[总之就是使每次访问的URL字符串不一样的] 设计WEB页面的时候 也应该遵守这个

VS2010中<无法打开包括文件:“iostream.h”:>错误解决方法

C/C++ code? 1 2 #include <iostream.h> 改为: C/C++ code? 1 2 #include <iostream> using namespace std; VS2010中<无法打开包括文件:"iostream.h":>错误解决方法

ajax回调函数中使用$(this)取不到对象的解决方法

如果在ajax的回调函数内使用$(this)的话,实践证明,是取不到任何对象的,需要的朋友可以参考下 $(".derek").each(function(){ $(this).click(function(){ var params = $(this).parent().serialize(); var obj=$(this).parent().siblings("div#caskContent"); var form=$(this).parent(); $.aja

Linux中npm出现npmlog找不到的解决方法

?Linux中npm出现npmlog找不到的解决方法 描述 今天在对nodejs项目进行服务器迁移的时,在新的linux服务器上输入 npm -v 命令后报 "cannot find module 'npmlog'-."的错误.找到的原因是拷贝过去的bin目录下的npm文件并没有链接到module目录下的npm-cli.js文件,所以导致在执行 npm -v 命令时,路径问题导致npmlog模块无法找到. 解决方法 解决的方法有两个,一个是删除bin目录下的npm文件,并用如下命令链接

spring加载过程中jar包加载不了,解决方法

当我们在开发spring项目时,一般会将jar包放到webInf/lib下,这样是myeclipse自动将jar包加载到tomcat中webapps下,但是当我们新建一个lib文件夹的情况下,我们add building Path时就会出错,这时候我们有个技巧供使用. 1.项目上点击右键搜索de,找到deployment assembly 目的就是将此处添加的jar包添加到系统webINF/lib路径下 来自为知笔记(Wiz) spring加载过程中jar包加载不了,解决方法

java中两double相加精度丢失问题及解决方法

在讨论两位double数0.1和0.2相加时,毫无疑问他们相加的结果是0.2.但是问题总是如此吗? 下面我们让下面两个doubles数相加,然后看看输出结果: @Test public void testBig(){ System.out.println(0.11+2001299.32); } 控制台输出2001299.4300000002 我们吃惊的发现,结果并不是我们预想的那样,这是为什么呢?又如何解决呢? 现贴出BigDecimal的一个构造函数的文档供大家参考 BigDecimal pu