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:输入没有可行的替代方案的主要内容,如果未能解决你的问题,请参考以下文章
Spark SQL 嵌套 JSON 错误“输入时没有可行的替代方案”
如何修复 Javadoc 注释有解析错误,详细信息:在解析 JAVADOC_TAG [NonEmptyAtClauseDescription] 时输入“*”没有可行的替代方案