在Spark SQL中使用Case语句时出现语法错误

时间:2016-09-28 11:01:40

标签: mysql apache-spark apache-spark-sql

我想运行一个case语句,它根据Spark SQL中的条件运行不同的SELECT语句,但不能正确地获取语法。

我的SQL语句看起来像这样

registerTable(sql="SELECT CASE WHEN typedKeyword > '' THEN (SELECT * FROM `temp.sdf0` WHERE  originalKeyword > ''AND  keyword > '' AND deviceType = 'devicetype' ) ELSE (SELECT * FROM `temp.tes` WHERE  originalKeyword > ''AND  keyword > '' ) END  ",alias="temp.test")

我不知道是否在spark SQL中支持CASE语句,所以如何实现这个

1 个答案:

答案 0 :(得分:0)

我已经使用了十几种类似SQL和SQL的方言,而且我从未见过这样的语法。看起来似乎存在对SQL子句应该做什么的核心误解。

SELECT子句用于描述标量元素的投影。在许多方言中,您可以在此子句中发出子查询 - 有时甚至是相关的子查询 - 但是您始终必须应用将结果转换为标量值的运算符。例如:

SELECT (CASE WHEN EXISTS (SELECT foo FROM tbl) THEN 1 ELSE 0 END)

这里" EXISTS"运算符将不相关的子查询转换为标量布尔值,因此它是合法的。

顶级查询中缺少FROM子句也是一个很大的危险信号。它或者类似甲骨文"双"这样的类似物在我见过的大约一半方言中是合法的,但如果你想要做的是动态切换两个问题,你几乎肯定做错了。 juergen是对的 - 您可能要做的就是使用2个不同的查询。