sql - 配置单元列别名中的奇怪行为

标签 sql hadoop 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 问题。

最佳答案

好的,我很确定我找到了。 Hive 解析器将其识别为定义如下的 ByteLengthLiteral:

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

我尝试用相同的语句将 b 替换为 kmg 并得到相同的错误.

并且为了信息的缘故,一个标识符(as [identifier])被定义为...

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

这似乎应该有效,只是 ByteLengthLiteral 已经被处理,因此无法识别标识符。

关于sql - 配置单元列别名中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23474145/

相关文章:

postgresql - 将 postgresql 数组导入配置单元

mysql - 更新查询在 mySQL 中不起作用

scala - 使用 spark 将 null 设置为 Hive 表中数字数据类型的值

sql: sqlite: 服务器端分页

hadoop - 护林员休息API获取组中的所有用户

hadoop - 除了为日志输出挖掘日志文件之外,有没有办法获取 Spark 跟踪 URL?

arrays - 结构列上的聚合 Hive

hadoop - 配置单元插入覆盖目录,存储为 Parquet 创建的具有默认名称的列

php - AJAX - 检查重复数据并发送通知

sql - 需要一个简单的 T-SQL 查询