我尝试在雅典娜中创建这个简单的表:
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
字段名称更改为WTF
、foobar
或strawberry
,并且工作正常(数据显示(。 - 我将
SystemID
字段名称更改为_SystemID
、f_SystemID
、ystemID
、System_I_D
,但它们都不起作用
永远不会有错误消息。
字段名称需要遵循哪些实际规则?
通常,使用 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手册,System_ID
不是保留关键字。
操作更新: 经过一些额外的实验,我还确定你不能在NON_RESERVED_KEYWORD中使用混合大小写。所有大写或全部小写都可以。