AWS Athena JSON多维数组结构

时间:2018-01-31 23:51:16

标签: sql arrays json amazon-web-services amazon-athena

JSON文件的结构如下:

"otherstuff" : "stuff",
"ArrayofArrays" : {
   "Array-1" : {
      "type" : "sometype",
      "is_enabled" : false,
      "is_active" : false,
      "version" : "version 1.1"
   },
   "Array-2" : {
      "type" : "sometype",
      "is_enabled" : false,
      "is_active" : false,
      "version" : "version 1.2"
   }
   ...
}

使用以下

运行查询
CREATE EXTERNAL TABLE IF NOT EXISTS test2.table14 (
`otherstuff` string,
`ArrayofArrays` array<array<struct<version:string>>>
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
     'serialization.format' = '1' ) LOCATION 's3://bucket/folder/' TBLPROPERTIES ('has_encrypted_data'='false')

但是,当我运行基本预览表查询时,我收到以下错误。

  

HIVE_BAD_DATA:解析字段#的字段值时出错:org.openx.data.jsonserde.json.JSONObject无法强制转换为org.openx.data.jsonserde.json.JSONArray

数组数组显然存在问题。我无法弄清楚结构应该是什么。你知道如何为这个结构声明multidimentional数组吗?

1 个答案:

答案 0 :(得分:1)

您的JSON不包含任何数组元素。因此,您必须使用map列类型来访问此结构,而不是数组。

CREATE EXTERNAL TABLE test14 (
  otherstuff string,
  ArrayofArrays map<string,struct<
     is_enabled:boolean,
     is_active:boolean,
     type:string,
     version:string
  >>
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ('serialization.format' = '1' ) 
LOCATION 's3://bucket/'

您可以通过以下查询语法访问地图:

select t.ArrayofArrays['array-1'] from test14 t