AWS Athena(Presto with JsonSerde)在某些列名称上悄然失败,哪些可以接受?

时间:2018-04-30 18:17:32

标签: hive presto amazon-athena

我尝试在Athena中创建这个简单的表:

CREATE EXTERNAL TABLE ctc.rets (
  `SystemID` string,
  `blah` string
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
  'mapping.SystemID' = 'L_ListingID',
  'mapping.blah' = 'Ext_Char10_11' 
) 
LOCATION 's3://xyz.bucket/mydata/'
TBLPROPERTIES ('has_encrypted_data'='false');

名为blah的字段映射正常,但名为SystemID的字段在每一行都显示为空白。

然后它变得非常有趣:

  • 我将SystemID字段名称更改为WTFfoobarstrawberry工作正常(数据显示) )。
  • 我将SystemID字段名称更改为_SystemIDf_SystemIDystemIDSystem_I_D均无法正常工作

永远不会有错误消息。

字段名称需要遵循哪些实际规则?

1 个答案:

答案 0 :(得分:3)

通常,使用SerDe进行映射以将保留字段名称映射到非保留字段名称。模式如下:

WITH SERDEPROPERTIES (
  'mapping.NON_RESERVED_KEYWORD' = 'RESERVED_KEYWORD'
)

来自github的真实示例:

CREATE TABLE mytable (
    myfield string, ts string
) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( "mapping.ts" = "timestamp" )
STORED AS TEXTFILE;

完成映射,因为timestamp是保留关键字。

在你的案例中,应该翻转System_ID。此外,我已检入Hive manualSystem_ID不是保留关键字。

OP UPDATE : 经过一些额外的实验,我还确定你不能在NON_RESERVED_KEYWORD中使用混合大小写。全部大写或全部小写都可以。