Sql unnest()不分解数组,返回错误列别名列表有1个条目,但“t”有2个可用列
我有一些json数据,其中包含一个属性“characters”,如下所示: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
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;”这两种语法都执行交叉连接。通过显式添加交叉连接,您希望实现什么?