蜂巢列别名中的奇怪行为

时间:2014-05-05 13:48:56

标签: sql hadoop hive

我正在尝试从应用程序构建一些hive(0.9)查询,允许用户指定列名别名。

我发现只要列别名是两个字符长并且是一个数字后跟'b'或'B',它就会给出错误:“无法识别选择目标中'AS''2b''附近的输入“

不起作用的查询:

select t1.emp_id as 1b from someTable t1;
select t1.emp_id as 2b from someTable t1;
select t1.emp_id as 1B from someTable t1;

有效的查询:

select t1.emp_id as 1b1 from someTable t1;
select t1.emp_id as 1ba from someTable t1;
select t1.emp_id as 1c from someTable t1;

这是Hive中的已知问题吗?我找不到任何与此类错误相关的JIRA问题。

2 个答案:

答案 0 :(得分:2)

好的,我很确定我发现了它。 hive解析器将此识别为ByteLengthLiteral,其定义如下:

ByteLengthLiteral
    :
    (Digit)+ ('b' | 'B' | 'k' | 'K' | 'm' | 'M' | 'g' | 'G')
    ;

我尝试使用bkm替换g的同一语句,并得到了相同的错误。

为了便于提供信息,标识符(as [identifier])定义为......

Identifier
    :
    (Letter | Digit) (Letter | Digit | '_')*
    | '`' RegexComponent+ '`'
    ;

除了已经处理ByteLengthLiteral之外,它似乎应该有效,因此无法识别标识符。

答案 1 :(得分:1)

climbbage给出了一个很好的答案,说明为什么会发生这种情况;这是一个如何解决它的答案 - 只需使用反引号,如下:

select t1.emp_id as `1b` from someTable t1;