使用Athena创建Overture地图数据外部表时遇语法错误
解决Overture地图数据建表时的EXTERNAL语法报错问题
问题描述
使用Overture Maps提供的Athena建表语句创建admins表时,执行以下SQL:
CREATE EXTERNAL TABLE `admins`( `id` string, `updateTime` string, `version` int, `names` map<string,array<map<string,string>>>, `adminLevel` int, `maritime` string, `subType` string, `localityType` string, `context` string, `isoCountryCodeAlpha2` string, `isoSubCountryCode` string, `defaultLanugage` string, `drivingSide` string, `sources` array<map<string,string>>, `bbox` struct<minX:double,maxX:double,minY:double,maxY:double>, `geometry` binary) PARTITIONED BY ( `type` string) STORED AS PARQUET LOCATION 's3://overturemaps-us-west-2/release/2023-07-26-alpha.0/theme=admins' MSCK REPAIR TABLE `admins`
触发错误:
line 1:8: mismatched input 'EXTERNAL'. Expecting: 'MATERIALIZED', 'OR', 'ROLE', 'SCHEMA', 'TABLE', 'VIEW'
解决方案
1. 移除EXTERNAL关键字(适配部分SQL引擎)
如果你的SQL引擎(如Databricks SQL、部分Presto/Trino环境)不支持显式的CREATE EXTERNAL TABLE语法,直接去掉EXTERNAL即可——这类引擎会通过指定LOCATION参数自动识别为外部表。同时修正原语句里的拼写错误defaultLanugage为defaultLanguage,修改后的建表语句:
CREATE TABLE `admins`( `id` string, `updateTime` string, `version` int, `names` map<string,array<map<string,string>>>, `adminLevel` int, `maritime` string, `subType` string, `localityType` string, `context` string, `isoCountryCodeAlpha2` string, `isoSubCountryCode` string, `defaultLanguage` string, `drivingSide` string, `sources` array<map<string,string>>, `bbox` struct<minX:double,maxX:double,minY:double,maxY:double>, `geometry` binary) PARTITIONED BY ( `type` string) STORED AS PARQUET LOCATION 's3://overturemaps-us-west-2/release/2023-07-26-alpha.0/theme=admins'
2. 拆分执行语句
将MSCK REPAIR TABLE作为单独的SQL语句执行,避免和建表语句放在同一批次运行:
MSCK REPAIR TABLE `admins`
3. 验证Athena环境配置(若使用AWS Athena)
如果确实在AWS Athena环境下,检查:
- 当前使用的Athena引擎版本是否为2.x及以上(旧版本语法存在差异)
- 确认目标数据库已创建,且执行语句时已切换到该数据库
内容的提问来源于stack exchange,提问作者Dunuts
相关产品推荐
相关产品推荐

