Sql unnest()不分解数组,返回错误列别名列表有1个条目,但“t”有2个可用列

Sql unnest()不分解数组,返回错误列别名列表有1个条目,但“t”有2个可用列,sql,presto,amazon-athena,Sql,Presto,Amazon Athena,我有一些json数据,其中包含一个属性“characters”,如下所示: select json_data['characters'] from latest_snapshot_events 返回:[{CHAR_STARS:1,CHAR_A1_LVL:1,ITEM_POWER:60,CHAR_A3_LVL:1,CHAR_TIER:1,ITEM:10,shard:0,CHAR_tpies:0,CHAR_A5_LVL:0,CHAR_A2_LVL:1,CHAR_A4_LVL:1,ITEM_CATE

我有一些json数据,其中包含一个属性“characters”,如下所示:

select json_data['characters'] from latest_snapshot_events
返回:[{CHAR_STARS:1,CHAR_A1_LVL:1,ITEM_POWER:60,CHAR_A3_LVL:1,CHAR_TIER:1,ITEM:10,shard:0,CHAR_tpies:0,CHAR_A5_LVL:0,CHAR_A2_LVL:1,CHAR_A4_LVL:1,ITEM_CATEGORY:Character,ITEM_LEVEL:3},{CHAR_STARS:1,CHAR_A1_LVL:1,ITEM_POWER:50,CHAR_A3_LVL:1,CHAR_TIER:1,ITEM:39,shard:0,CHAR_tpies:0,CHAR_A5_LVL:0,CHAR_A2_LVL:1,CHAR_A4_LVL:1,ITEM_CATEGORY:Character,ITEM_LEVEL:2},{CHAR_STARS:1,CHAR_A1_LVL:1,ITEM_POWER:80,CHAR_A3_LVL:1,CHAR_TIER:1,ITEM:680145048388220,shard:0,CHAR_tpiees:0,CHAR_A5_LVL:1,CHAR_A2_LVL:1,CHAR_A4_LVL:1,ITEM_类别:Character,ITEM_LEVEL:4},{CHAR_STARS:1,CHAR_A1_LVL:1,ITEM_POWER:85,CHAR_A3_LVL:1,CHAR_TIER:1,ITEM:8355588830097610,shard:0,CHAR_tpiees:5,CHAR_A5_LVL:0,CHAR_A2_LVL:1,CHAR_A4_LVL:1,ITEM_类别:Character,ITEM_LEVEL:4}]

这是一行返回的。我希望数组中的每个项都有一行

我发现一些SO帖子和其他博客建议我使用unnest。我已经尝试了好几次,但无法返回结果。例如,.底部覆盖了unnest,作为蜂巢横向视图的替代:

SELECT student, score
FROM tests
CROSS JOIN UNNEST(scores) AS t (score);
因此,我尝试将此应用于我的表:

characters as (
select
  jdata.characters
from latest_snapshot_events
cross join unnest(json_data) as t(jdata)
)
select * from characters;
其中,json_数据是最新的_快照_事件中的字段,该事件包含属性“characters”,该属性是一个类似于上面所示的数组

这将返回一个错误:

[Simba]AthenaJDBC AWS Athena客户端引发了一个错误。语法错误:第69:12行:列别名列表有1个条目,但“t”有2个可用列

如何将最新的\u快照\u事件.json\u数据['characters']取消显示/分解到多行?

由于字符是文本表示的json数组,您必须:

使用解析JSON文本以生成类型为的值。 使用将JSON值转换为SQL数组。 使用将数组分解。 例如:

使用数据字符作为 值“[{CHAR_STARS:1,CHAR_A1_LVL:1,ITEM_POWER:60,CHAR_A3_LVL:1,CHAR_TIER:1,ITEM:10,shard:0,CHAR_tpies:0,CHAR_A5_LVL:0,CHAR_A2_LVL:1,CHAR_A4_LVL:1,ITEM_CATEGORY:Character,ITEM_LEVEL:3},{CHAR_STARS:1,CHAR_A1_LVL:1,ITEM_POWER:50,CHAR_A3_LVL:1,CHAR_TIER:1,ITEM:39,shard:0,CHAR_tpies:0,CHAR_A5_LVL:0,CHAR_A2_LVL:1,CHAR_A4_LVL:1,ITEM_CATEGORY:Character,ITEM_LEVEL:2},{CHAR_STARS:1,CHAR_A1_LVL:1,ITEM_POWER:80,CHAR_A3_LVL:1,CHAR_TIER:1,ITEM:680145048388220,shard:0,CHAR_tpiees:0,CHAR_A5_LVL:1,CHAR_A2_LVL:1,CHAR_A4_LVL:1,ITEM_类别:Character,ITEM_LEVEL:4},{CHAR_STARS:1,CHAR_A1_LVL:1,ITEM_POWER:85,CHAR_A3_LVL:1,CHAR_TIER:1,ITEM:8355588830097610,shard:0,CHAR_TPIECES:5,CHAR_A5_LVL:0,CHAR_A2_LVL:1,CHAR_A4_LVL:1,ITEM_类别:Character,ITEM_LEVEL:4}] 选择条目 从数据中,UNNESTCASTjson_将字符解析为arrayjson tentry 产生:

                               entry
-----------------------------------------------------------------------
 {"CHAR_STARS":1,"CHAR_A1_LVL":1,"ITEM_POWER":60,"CHAR_A3_LVL":1,...
 {"CHAR_STARS":1,"CHAR_A1_LVL":1,"ITEM_POWER":50,"CHAR_A3_LVL":1,...
 {"CHAR_STARS":1,"CHAR_A1_LVL":1,"ITEM_POWER":80,"CHAR_A3_LVL":1,...
 {"CHAR_STARS":1,"CHAR_A1_LVL":1,"ITEM_POWER":85,"CHAR_A3_LVL":1,...
在上面的示例中,我将JSON值转换为arrayjson,但是 如果每个文件中的值 数组项具有常规架构。例如,对于您的数据,它是 可以将其强制转换为arraymapvarchar、json,因为 数组是JSON对象。

由于字符是文本表示的JSON数组,您必须:

使用解析JSON文本以生成类型为的值。 使用将JSON值转换为SQL数组。 使用将数组分解。 例如:

使用数据字符作为 值“[{CHAR_STARS:1,CHAR_A1_LVL:1,ITEM_POWER:60,CHAR_A3_LVL:1,CHAR_TIER:1,ITEM:10,shard:0,CHAR_tpies:0,CHAR_A5_LVL:0,CHAR_A2_LVL:1,CHAR_A4_LVL:1,ITEM_CATEGORY:Character,ITEM_LEVEL:3},{CHAR_STARS:1,CHAR_A1_LVL:1,ITEM_POWER:50,CHAR_A3_LVL:1,CHAR_TIER:1,ITEM:39,shard:0,CHAR_tpies:0,CHAR_A5_LVL:0,CHAR_A2_LVL:1,CHAR_A4_LVL:1,ITEM_CATEGORY:Character,ITEM_LEVEL:2},{CHAR_STARS:1,CHAR_A1_LVL:1,ITEM_POWER:80,CHAR_A3_LVL:1,CHAR_TIER:1,ITEM:680145048388220,shard:0,CHAR_tpiees:0,CHAR_A5_LVL:1,CHAR_A2_LVL:1,CHAR_A4_LVL:1,ITEM_类别:Character,ITEM_LEVEL:4},{CHAR_STARS:1,CHAR_A1_LVL:1,ITEM_POWER:85,CHAR_A3_LVL:1,CHAR_TIER:1,ITEM:8355588830097610,shard:0,CHAR_TPIECES:5,CHAR_A5_LVL:0,CHAR_A2_LVL:1,CHAR_A4_LVL:1,ITEM_类别:Character,ITEM_LEVEL:4}] 选择条目 从数据中,UNNESTCASTjson_将字符解析为arrayjson tentry 产生:

                               entry
-----------------------------------------------------------------------
 {"CHAR_STARS":1,"CHAR_A1_LVL":1,"ITEM_POWER":60,"CHAR_A3_LVL":1,...
 {"CHAR_STARS":1,"CHAR_A1_LVL":1,"ITEM_POWER":50,"CHAR_A3_LVL":1,...
 {"CHAR_STARS":1,"CHAR_A1_LVL":1,"ITEM_POWER":80,"CHAR_A3_LVL":1,...
 {"CHAR_STARS":1,"CHAR_A1_LVL":1,"ITEM_POWER":85,"CHAR_A3_LVL":1,...
在上面的示例中,我将JSON值转换为arrayjson,但是 如果每个文件中的值 数组项具有常规架构。例如,对于您的数据,它是 可以将其强制转换为arraymapvarchar、json,因为 数组是JSON对象。

如果初始数据是JSON字符串,则JSON_解析可以工作。但是,对于arrayrow类型,即对象/字典数组,强制转换为arrayjson会将每一行转换为数组,从对象中删除所有键,并阻止您使用点表示法或JSON_提取函数

要取消对arrayrow数据的测试, 语法要简单得多:

CROSS JOIN UNNEST(my_array) AS my_row
如果初始数据是json字符串,json_解析就可以工作。但是,对于arrayrow类型,即对象/字典数组,强制转换为arrayjson将把每一行转换为一个数组,从对象中删除所有键,并阻止您使用点表示法或json_提取函数

要运行arrayrow数据,语法要简单得多:

CROSS JOIN UNNEST(my_array) AS my_row

如果有人在这里登陆,我必须在取消测试之前添加交叉连接。因此,从数据中,交叉连接UNNESTCASTjson_parsecharacters作为arrayjson tentry“从数据中,交叉连接UNNESTCASTjson_parsecharacters作为arrayjson tentry”;或“从数据中,交叉连接UNNESTCASTjson_parsecharacters作为arrayjson tentry;“这两种语法都执行交叉连接。您希望通过显式添加交叉连接来实现什么?如果其他人在此处登陆,我必须在unnest之前添加交叉连接。因此,从数据中,交叉连接UNNESTCASTjson_parsecharacters AS arrayjson tentry”,从数据中,交叉连接UNNESTCASTjson_parsecharacters AS arrayjson tentry;“或者“从数据中,UNNESTCASTjson_parsecharacters AS arrayjson tentry;”这两种语法都执行交叉连接。通过显式添加交叉连接,您希望实现什么?