解析具有 JSON 列且每个字段包含多行的表

问题描述 投票:0回答:2

我有一个与此类似的表,我需要从 id 等于 2 的每个 JSON 字段中提取值。我已经尝试了多个示例,但无法设法理解如何操作 json_tuples / Lateral视图/爆炸进入我的场景。

value1,value2,value3,"[{""id"":1,""value"":""x""},{"id"":2,""value"":""y""}, {"id"":3,""value"":""blah""}]"
value4,value5,value6,"[{""id"":1,""value"":""a""},{"id"":2,""value"":""b""}, {"id"":3,""value"":""blahblah""}]"
col1 col2 col3 id2值
值1 值2 值3 y
值4 值5 值6 b

我尝试操纵的示例: 如何从 Hive 中的 json 字符串中提取选定的值

  • 我不知道如何检查子行中的值

Hive Sql 查询从 Json 数组获取 Json 对象 -不知道如何将其与选择普通列结合起来

sql json hive
2个回答
0
投票

你的例子有点不清楚,所以我做了一些猜测和假设(值*字符串位于单独的列中,你的json字符串存储在数组列中,...并且你的json数组中的引号是一团乱,这不是有效的 json。)

您可以在 json 数组(技术上是结构数组)上使用横向视图,然后您可以对其进行过滤。

select
col1,
col2,
col3,
exp.id,
exp.value
from
<your table>
lateral view inline(<array column>) exp as id,value
where
exp.id = 1

编辑: 如果你的 json 只是存储为字符串数组(有效的 json),那么你必须经历一些额外的麻烦。您可以使用正则表达式将其转换为数组并爆炸。 然后您可以使用 json_tuple 拉出各个元素。 如果有更好/不那么难看的方法来做到这一点,我不知道。

select
col1,
col2,
col3,
t2.*,
jsonstring,
t.col


from
<your table>
--first strip the [] off so hive can see this as an array
LATERAL VIEW explode(
  split(
    regexp_replace(yourtable.jsonstring,'^\\[|\\]$',''), '(?<=\\}),(?=\\{)'   
     )
) t as col
--and then use json_tuple to get the elements from the array
lateral view json_tuple(t.col,'id','value') t2 as id,value
where
t2.id = 2

0
投票

我已经声明了一个与您所说的值相同的表:

DECLARE @Value1 NVARCHAR(200) = '{"id":1,"values":"x"}' 
DECLARE @Value2 NVARCHAR(200) = '{"id":2,"values":"y"}' 
DECLARE @Value3 NVARCHAR(200) = '{"id":3,"values":"blah"}' 
DECLARE @Value4 NVARCHAR(200) = '{"id":1,"values":"a"}' 
DECLARE @Value5 NVARCHAR(200) = '{"id":2,"values":"b"}' 
DECLARE @Value6 NVARCHAR(200) = '{"id":3,"values":"blahblah"}' 
DECLARE @T_Table TABLE (col1 NVARCHAR(MAX) , col2 NVARCHAR(MAX) , col3 NVARCHAR(MAX) , id2value NVARCHAR(MAX))

INSERT INTO @T_Table VALUES (@Value1,@Value2,@Value3,'y') , (@Value4,@Value5,@Value6,'b')

之后,我将 col1 、 col12 、 col13 的所有数据读取为一个 JSON 字符串,并选择 id=2 的值

DECLARE @Json NVARCHAR(MAX) = ( SELECT '[' + STRING_AGG (col1+','+col2+','+col3, ',') +']' FROM @T_Table)
SELECT [values] FROM OPENJSON(  @Json) WITH ([id] NVARCHAR(MAX)  , [values] NVARCHAR(MAX) )
where [id] = 2

最终结果是:

y

b

© www.soinside.com 2019 - 2024. All rights reserved.