亚马逊 Athena:输入无可行替代方案

68
在创建 Athena 表时,会出现以下异常信息:

在输入中没有可行的替代方案


1
在我的情况下,表名不能以数字开头,必须是字母。 - kenorb
Athena真是个麻烦事;我希望AWS能够投入更多的精力。虽然难以使用,但因为价格便宜,人们仍然在使用它。 - wordsforthewise
13个回答

58

表名中不允许出现连字符(虽然向导允许),只需删除连字符即可轻松解决问题。


2
在我的情况下,是因为我以数字开头命名了表格名称:2017_04_03_some_data。我将其更改为some_data_20170403,然后它就可以工作了。 - Jonathan Morales Vélez
1
我在尝试创建一个带有连字符'-'列名的表时遇到了相同的错误。 - campeterson
1
在我的情况下,是因为DDL中有COMMENT条目。删除后就可以正常工作了。 - tedder42
3
我的情况是末尾缺少 )。 :) - ChikuMiku
2
数据库名称也不能含有连字符。 - Alex Harvey
显示剩余3条评论

50

很遗憾,目前 Athena 的语法验证错误信息并不太具有描述性,这个错误可能意味着在创建表语句中存在几乎任何可能的语法错误。

虽然目前这很恼人,但您需要检查语法是否遵循创建表文档

一些例子包括:

  • 反引号未放置正确(如已经指出)
  • 缺少 / 多余的逗号(请记住,最后一列在列定义后不需要逗号)
  • 缺少空格
  • 更多 …

我的“更多...”多了一个> - CorayThan
我的DDL缺少一个逗号。幸运的是,错误会在开头给出要查看的行号。 - Nirmal
我不小心在属性名称中提供了一个空格。基本上,抛出的错误表明查询语法有问题,这是我看到的。 - Divyesh Kalbhor
谢谢!顺便说一下,创建表格的文档已经移动到https://docs.aws.amazon.com/athena/latest/ug/create-table.html。 - burkay
请勿在最后一个 col_name 数据类型组合之后加逗号。 - 00schneider
显示剩余3条评论

11

这个错误通常发生在DDL的语法存在一些小错误时。有几个答案解释了不同状态下的不同错误。解决这个问题的简单方法是仔细查看DDL并逐行验证以下几点:

  1. 检查是否缺少逗号
  2. 未平衡的 `(反引号运算符)
  3. 不受HIVE支持的不兼容数据类型(HIVE数据类型参考)
  4. 未平衡的逗号
  5. 表名中有连字符

4
我的情况是:这是一个外部表,位置有错别字(因此不存在)
几个提示:
- 点击“格式化查询”按钮,以便您可以轻松地发现错误。 - 使用文档底部的示例 - 它有效 - 并使用您的参数进行修改:https://docs.aws.amazon.com/athena/latest/ug/create-table.html

4
在我的情况下,是因为表格中最后一列后面有一个逗号。例如:
CREATE EXTERNAL TABLE IF NOT EXISTS my_table (
  one STRING,
  two STRING,
) LOCATION 's3://my-bucket/some/path';

在我去掉了two STRING,末尾的逗号后,它正常工作了。


3

反斜杠。我的问题出在反斜杠上。我有来自 Athena 的 DDL,保存为 Python 字符串。

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

被改为

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

一切都崩溃了。

必须做到:

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

请在此进一步说明:https://economics.stackexchange.com/a/6354/4483 - BCLC

2
在我的情况下,是在“PARTITIONED BY”部分出现了一个额外的逗号。

1
在我的情况下,我遗漏了S3 URL的单引号。

1
作为其他用户所指出的,Athena提供的标准语法验证错误消息并不特别有帮助。彻底检查所需的DDL语法(请参见HIVE数据类型参考)可能会相当繁琐,因为它非常广泛。
因此,另一个故障排除技巧让AWS自己的数据解析引擎(AWS Glue)给您提示您的DDL可能存在问题的地方。这里的想法是让AWS Glue使用其自己的内部规则解析数据,然后向您显示您可能犯错的地方。
具体来说,以下是我用来排除我的DDL语句问题的步骤:
  1. AWS Glue中创建数据爬虫;AWS和许多其他地方都会详细介绍所需的步骤,因此我不会在这里重复。
  2. 将爬虫指向您想要上传到Athena的相同数据(但失败了)。
  3. 将爬虫输出设置为表格(在您已经创建的Athena数据库中)。
  4. 运行爬虫,并等待填充数据的表格被创建。
  5. 在Athena查询编辑器选项卡中找到新创建的表格,点击三个垂直点(...),然后选择“生成创建表DLL”: enter image description here
  6. 这将使Athena为此表格创建DLL,该DLL保证有效(因为该表格已经使用该DLL创建)。
  7. 查看此DLL,看看它与您最初编写的DLL有何区别。自然而然,这个自动生成的DLL可能没有您认为有用的确切数据类型选择,但至少您知道它是100%有效的。
  8. 最后,根据这个新的Glue / Athena生成的DLL更新您的DLL,调整列/字段名称和数据类型以适合您的特定用例。

1
在查找并遵循这里所有好的答案后,我的问题是在Node.js中工作时,我需要删除行设置中使用的可选ESCAPED BY '\',以使我的查询起作用。希望这能帮助其他人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接