Amazon Athena:输入没有可行的替代方案

Posted

技术标签:

【中文标题】Amazon Athena:输入没有可行的替代方案【英文标题】:Amazon Athena: no viable alternative at input 【发布时间】:2017-04-16 04:14:06 【问题描述】:

在 Athena 中创建表时;它给了我以下异常:

输入没有可行的替代方案

【问题讨论】:

在我的例子中,表名不能从数字开始,它必须是字母。 【参考方案1】:

在这里搜索并关注所有好的答案后。 我的问题是在 Node.js 中工作我需要删除可选的 ESCAPED BY '\' 在行设置中使用以使我的查询正常工作。希望这对其他人有所帮助。

【讨论】:

【参考方案2】:

不幸的是,目前 Athena 中的语法验证错误消息的描述性不是很好,这个错误可能意味着“几乎”任何可能在 create table 语句中出现的语法错误。

虽然目前这很烦人,但您需要检查语法是否遵循Create table documentation

一些例子是:

反引号不在位(如前所述) 缺少/多余的逗号(请记住,最后一列不需要在列定义后加逗号 缺少空格 更多..

【讨论】:

我的“更多..”是一个额外的> 我的 DDL 缺少逗号。幸运的是,错误给出了开头要查看的行号。 我错误地在属性名称中提供了一个空格。基本上,抛出的错误表明查询的语法有任何问题,这就是我的看法。 谢谢!对了,创建表文档移到docs.aws.amazon.com/athena/latest/ug/create-table.html 我的“更多..”是非破坏空间 \xa0 而不是常规空间。 @Nirmal 错误中提到的行号具有误导性!【参考方案3】:

正如其他用户所指出的,Athena 提供的标准语法验证错误消息并不是特别有用。彻底检查其他用户提到的所需 DDL 语法(请参阅 HIVE data types reference)可能非常乏味,因为它相当广泛。

因此,另一个故障排除技巧让 AWS 自己的数据解析引擎 (AWS Glue) 提示您 DDL 可能在哪里关闭。这里的想法是让 AWS Glue 使用自己的内部规则解析数据,然后向您展示您可能在哪里犯了错误。

具体来说,以下是对我的 DDL 语句进行故障排除的步骤,这给我带来了很多麻烦:

    在AWS Glue中创建数据爬虫; AWS 和许多其他地方都经历了这需要的非常详细的步骤,所以我不会在这里重复它 将抓取工具指向您想要(但未能)上传到 Athena 的相同数据 将爬虫输出设置为表(在您已经创建的 Athena 数据库中) 运行爬虫并等待创建填充数据的表 在 Athena Query Editor 选项卡中找到新创建的表,单击三个垂直点 (...),然后选择“Generate Create Table DLL”: 这将使 Athena 为该表创建保证有效的 DLL(因为该表已经使用该 DLL 创建) 查看此 DLL,看看它是否/在哪里/如何与您最初编写的 DLL 不同。自然,这个自动生成的 DLL 不会对您可能觉得有用的数据类型进行准确的选择,但至少您会知道它是 100% 有效的 最后,根据这个新的 Glue/Athena 生成的 DLL 更新您的 DLL,为您的特定用例调整列/字段名称和数据类型

【讨论】:

【参考方案4】:

由于查询中有 cmets,这发生在我身上。

当我尝试“格式化查询”按钮时,我意识到这是一种可能性,它把整个事情变成了几乎 1 行,大部分都被注释掉了。我的猜测是查询解析器会在将查询发送到 Athena 之前运行此格式化程序。

移除 cmets,运行查询,天使长出了翅膀!

【讨论】:

【参考方案5】:

第一次使用 UI 时对我来说并不明显的是,如果您在创建表“向导”中遇到错误,您可以取消,并且应该有使用的查询失败写入新的查询窗口,供您编辑和修复。

我的数据库有一个连字符,所以我在查询中添加了反引号并重新运行它。

【讨论】:

【参考方案6】:

斜线。我的是斜线。我有来自 Athena 的 DDL,保存为 python 字符串。

WITH SERDEPROPERTIES ( 
  'escapeChar'='\\', 
  'quoteChar'='\"',
  'separatorChar'=',')  

改为

WITH SERDEPROPERTIES ( 
  'escapeChar'='\', 
  'quoteChar'='"',
  'separatorChar'=',')

一切都崩溃了。

必须成功:

WITH SERDEPROPERTIES (
  'escapeChar'='\\\\', 
  'quoteChar'='\\\"',
  'separatorChar'=',')

【讨论】:

请在此处进一步澄清:economics.stackexchange.com/a/6354/4483【参考方案7】:

我的情况:这是一个外部表,位置有错字(因此不存在)

几个提示:

点击“格式查询”按钮,您可以轻松发现错误 使用文档底部的示例 - 它可以工作 - 并使用您的参数对其进行修改:https://docs.aws.amazon.com/athena/latest/ug/create-table.html

【讨论】:

【参考方案8】:

这个错误一般发生在DDL的语法有一些愚蠢的错误时。有几个答案可以根据那里的状态解释不同的错误。解决这个问题的简单方法是耐心查看DDL和逐行验证以下几点:-

    检查缺少的逗号 不平衡的`(反引号运算符) HIVE(HIVE DATA TYPES REFERENCE) 不支持不兼容的数据类型 不平衡的逗号 表名中的连字符

【讨论】:

【参考方案9】:

就我而言,根据 AWS 文档,其中一个表列名称用单引号括起来:( ('bucket')

【讨论】:

【参考方案10】:

在我的情况下,这是因为表中最后一列后面的逗号。例如:

CREATE EXTERNAL TABLE IF NOT EXISTS my_table (
  one STRING,
  two STRING,
) LOCATION 's3://my-bucket/some/path';

在我删除two STRING, 末尾的逗号后,它工作正常。

【讨论】:

【参考方案11】:

就我而言,我缺少 S3 URL 的单引号

【讨论】:

【参考方案12】:

在我的例子中,它是 PARTITIONED BY 部分中的一个额外逗号

【讨论】:

【参考方案13】:

表名中不允许使用连字符..(尽管向导允许)..只需删除连字符,它就像一个魅力

【讨论】:

就我而言,这是因为我以数字开头的表名:2017_04_03_some_data。我改成some_data_20170403,它成功了。 我在尝试创建包含连字符的列名的表时遇到了同样的错误'-' 在我的例子中,它来自于 DDL 中的 COMMENT 条目。删除后工作。 在我的情况下,) 最后丢失了。 :) 数据库中也不能有连字符。

以上是关于Amazon Athena:输入没有可行的替代方案的主要内容,如果未能解决你的问题,请参考以下文章

SiddhiQL 中的语法错误,输入时没有可行的替代方案

ParseExpection:输入时没有可行的替代方案

在 cassandra 中输入“>”没有可行的替代方案

房间数据库 - 查询错误作为输入时没有可行的替代方案

Spark SQL 嵌套 JSON 错误“输入时没有可行的替代方案”

如何修复 Javadoc 注释有解析错误,详细信息:在解析 JAVADOC_TAG [NonEmptyAtClauseDescription] 时输入“*”没有可行的替代方案