我有一个与此类似的表,我需要从 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 对象 -不知道如何将其与选择普通列结合起来
你的例子有点不清楚,所以我做了一些猜测和假设(值*字符串位于单独的列中,你的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
我已经声明了一个与您所说的值相同的表:
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