簡體   English   中英

如何處理 JSON 在 AWS ATHENA 的列名中有特殊字符

[英]How to deal with JSON with special characters in Column Names in AWS ATHENA

盡管我對 Hive 有一些短暫的體驗,但我還是雅典娜的新手。

我正在嘗試從 JSON 文件創建一個表,這些文件是從 MongoDB 導出的。我的問題是 MongoDB 使用 $oid、$numberInt、$numberDoble 和其他作為內部引用,但 ' $ ' 在列名中不被接受雅典娜。

這是我創建的用於測試的單行 JSON 文件:

{"_id":{"$oid":"61f87ebdf655d153709c9e19"}}

這是引用它的表:

CREATE EXTERNAL TABLE landing.json_table (
`_id` struct<`$oid`:string>
)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://bucket-name/test/';

當我運行一個簡單的 SELECT * 它返回這個錯誤:

HIVE_METASTORE_ERROR:錯誤:名稱預期位於“struct<$oid:string>”的 position 7,但找到了“$”。 (服務:null;狀態代碼:0;錯誤代碼:null;請求 ID:null;代理:null)

這與 JSON 列包含 $ 的事實有關。

關於如何處理這種情況的任何想法? 我現在唯一的解決辦法是創建一個腳本,從不接受的字符中“清除”json 文件,但如果可能的話,我真的更願意直接在 Athena 中處理它

如果切換到 OpenX SerDe,您可以為 JSON 字段創建一個 SerDe 映射,名稱中包含特殊字符,如$

請參閱 AWS 博客條目Create Tables in Amazon Athena from Nested JSON 和 Mappings Using JSONSerDe ,“演練:使用映射處理禁用字符”部分。

適用於您的示例的映射:

CREATE EXTERNAL TABLE landing.json_table (
`_id` struct<`oid`:string>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
"mapping.oid"="$oid"
)
LOCATION 's3://bucket-name/test/';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM