由于默认别名(_c3)导致的语法错误

时间:2017-07-11 14:07:01

标签: hadoop hive hiveql

我使用查询来创建一个表,其中一列中有一个SET。

T1:

    serial   _c3
1   193748   ["special","normal","normal"]
2   263565   ["normal","normal"]

然后我有另一张只有连续剧的表。

T2:

    serial   
1   193748  
2   263565
3   636474
4   928396

我想要一个从T2生成序列号的查询,如果它们不在T1中,或者T1的_c3数据有单词" special"在里面。我还想要一个布尔值,指示T1是否在T2中。

所以使用上面的例子,我想:

T3:

    serial   in_t1 
1   193748   1
3   636474   0
4   928396   0

到目前为止,这是我的查询:

SELECT 
    T2.serial,
    array_contains(T1._c3, 'special') as in_t1
FROM T2 LEFT OUTER JOIN T1 ON T1.serial = T2.serial
WHERE T1.serial is NULL OR array_contains(T1._c3, 'special')
LIMIT 50;

因此对于select行中的array_contains,我收到以下错误消息:

编译语句时出错:FAILED:无法识别' T1'附近的输入'' ' _c3'在选择表达式中。

当我从select中删除该行并运行时:

SELECT 
    T2.serial
FROM T2 LEFT OUTER JOIN T1 ON T1.serial = T2.serial
WHERE T1.serial is NULL OR array_contains(T1._c3, 'special')
LIMIT 50;

我得到了同样的错误,但现在在WHERE子句行中:无法识别' T1'附近的输入'' ' _c3'在选择表达式

你能指出我正确的方向吗?谢谢!

1 个答案:

答案 0 :(得分:1)

_c3是非法别名/列名,因为下划线是其第一个字符 如果你想使用它,请用滴答符号(`)包装它 另一种选择是重命名为列 最干净的解决方案就是首先对表达式进行别名。