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

Amazon Athena: no viable alternative at input

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

no viable alternative at input

table 名称中不允许使用连字符..(虽然向导允许)..只需删除连字符,它就像一个魅力

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

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

一些例子是:

  • 没有反引号(正如已经指出的那样)
  • Missing/extra 逗号(记住最后一列在列定义后不需要逗号
  • 缺少空格
  • 更多..

就我而言,这是 PARTITIONED BY 部分中的一个 额外逗号

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

在我的例子中,这是因为 table 中最后一列后面有一个尾随逗号。例如:

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

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

就我而言,根据 AWS 文档,table 列名称之一用单引号引起来:( ('bucket')

这个错误一般出现在DDL的语法有些傻的时候errors.There有几个答案根据不同的状态解释不同的错误。解决这个问题的简单方法就是耐心看一下DDL 并逐行验证以下几点:-

  1. 检查是否缺少逗号
  2. 不平衡`(反引号运算符)
  3. HIVE 不支持不兼容的数据类型(HIVE DATA TYPES REFERENCE)
  4. 逗号不平衡
  5. table 名称中的 Hypen

我的案例:这是一个外部 table 并且位置有错字(因此不存在)

几个提示:

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

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

已更改为

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

一切都崩溃了。

必须做到:

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

我第一次使用 UI 时对我来说不明显的是,如果您在创建 table 'wizard' 时遇到错误,您可以取消并应该有使用失败的查询写入新查询 window,供您编辑和修复。

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

由于查询中有评论,我遇到了这种情况。

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

删除了评论,运行 查询,天使长出了翅膀!

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

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

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

  1. AWS Glue 中创建数据爬虫; AWS 和许多其他地方都经历了这需要的非常详细的步骤,所以我不会在这里重复
  2. 将爬虫指向您想要(但未能)上传到 Athena 的相同数据
  3. 将爬虫输出设置为 table(在您已经创建的 Athena 数据库中)
  4. 运行 爬虫并等待 table 填充数据
  5. 在 Athena Query Editor 选项卡中找到 newly-created table,单击三个垂直点 (...),然后 select “生成 创建 Table动态链接库”:
  6. 这将使 Athena 为此 table 创建 保证有效 的 DLL(因为 table 已经 使用该 DLL 创建)
  7. 看一下这个 DLL,发现 if/where/how 它与您最初编写的 DLL 不同。当然,此 automatically-generated DLL 不会为您可能会发现有用的数据类型提供确切的选择,但至少您会知道它是 100% 有效的
  8. 最后,根据这个新 Glue/Athena-generated-DLL 更新您的 DLL,针对您的特定用例调整 column/field 名称和数据类型

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