Google bigquery BigQuery中json对象的最新字符串化数组
我有一个表,其中包含一个字符串列,其中包含JSON对象的字符串化列表,如下所示:Google bigquery BigQuery中json对象的最新字符串化数组,google-bigquery,Google Bigquery,我有一个表,其中包含一个字符串列,其中包含JSON对象的字符串化列表,如下所示: '[{"a": 5, "b": 6}, {"a": 7, "b": 8}]' 我想取消这个数组的测试,然后使用json_extract或json_extract_scalar从这些对象中获取值 目前还不清楚我是否能够使用烘焙功能实现这一点 是否需要一个UDF来完成此任务,或者BigQuery中是否存在此功能 下面的UDF完成了我想要的: CREATE TEMP FUNCTION JSON_EXTRACT_AR
'[{"a": 5, "b": 6}, {"a": 7, "b": 8}]'
我想取消这个数组的测试,然后使用json_extract或json_extract_scalar从这些对象中获取值
目前还不清楚我是否能够使用烘焙功能实现这一点
是否需要一个UDF来完成此任务,或者BigQuery中是否存在此功能
下面的UDF完成了我想要的:
CREATE TEMP FUNCTION
JSON_EXTRACT_ARRAY(input STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
return JSON.parse(input).map(x => JSON.stringify(x));
""";
with
raw as (
select
1 as id,
'[{"a": 5, "b": 6}, {"a": 7, "b": 8}]' as body
)
select
id,
json_extract(entry, '$.a') as a,
json_extract(entry, '$.b') as b
from
raw,
unnest(json_extract_array(body)) as entry
试试这样的
with
raw as (
select
1 as id,
'[{"a": 5, "b": 6}, {"a": 7, "b": 8}]' as body
)
select
r.id,
r.body,
regexp_extract_all(r.body, r'({.*?})'),
json_extract(entry, '$.a') as a,
json_extract(entry, '$.b') as b
from
raw as r
cross join unnest(
regexp_extract_all(r.body, r'({.*?})')
) as entry
或者是一个更一般的解决方案
with
raw as (
select
1 as id,
'[{"a": 5, "b": {"x": 1, "y": 2}}, {"b": {"c": 5, "d": 8}, "a": 7}]' as body
)
select
r.id,
r.body,
split(trim(r.body, '[]{}'), '}, {'),
json_extract(concat('{', entry, '}'), '$.a') as a,
json_extract(concat('{', entry, '}'), '$.b') as b
from
raw as r
cross join unnest(
split(trim(r.body, '[]{}'), '}, {')
) as entry
试试这样的
with
raw as (
select
1 as id,
'[{"a": 5, "b": 6}, {"a": 7, "b": 8}]' as body
)
select
r.id,
r.body,
regexp_extract_all(r.body, r'({.*?})'),
json_extract(entry, '$.a') as a,
json_extract(entry, '$.b') as b
from
raw as r
cross join unnest(
regexp_extract_all(r.body, r'({.*?})')
) as entry
或者是一个更一般的解决方案
with
raw as (
select
1 as id,
'[{"a": 5, "b": {"x": 1, "y": 2}}, {"b": {"c": 5, "d": 8}, "a": 7}]' as body
)
select
r.id,
r.body,
split(trim(r.body, '[]{}'), '}, {'),
json_extract(concat('{', entry, '}'), '$.a') as a,
json_extract(concat('{', entry, '}'), '$.b') as b
from
raw as r
cross join unnest(
split(trim(r.body, '[]{}'), '}, {')
) as entry
谷歌已经将该函数添加到他们的标准SQL中,因此现在无需自定义项就可以实现。事实上,由于OP中的UDF名称与JSON_EXTRACT_数组的名称相同,因此可以按原样在UDF下面运行该查询,它将正常工作 如果性能很重要,您也可以通过将主体数据提取到重复记录中来利用,而不是完全取消表的规范化
with
raw as (
select
1 as id,
'[{"a": 5, "b": 6}, {"a": 7, "b": 8}]' as body
)
select
r.id,
array(
select
struct (
json_value(items, '$.a') as a,
json_value(items, '$.b') as b
) as b
from unnest(json_extract_array(body, '$')) as items
) as body_record_repeated
from raw r
哪个会回来
谷歌已经将该函数添加到他们的标准SQL中,因此现在无需自定义项就可以实现。事实上,由于OP中的UDF名称与JSON_EXTRACT_数组的名称相同,因此可以按原样在UDF下面运行该查询,它将正常工作 如果性能很重要,您也可以通过将主体数据提取到重复记录中来利用,而不是完全取消表的规范化
with
raw as (
select
1 as id,
'[{"a": 5, "b": 6}, {"a": 7, "b": 8}]' as body
)
select
r.id,
array(
select
struct (
json_value(items, '$.a') as a,
json_value(items, '$.b') as b
) as b
from unnest(json_extract_array(body, '$')) as items
) as body_record_repeated
from raw r
哪个会回来
看起来你有解决方案了-这里的问题是什么?您想要不涉及UDF的解决方案吗?还是别的什么?请澄清-因为我仍然不清楚您突出显示/粗体的内容,请投赞成票。对不起,我认为我的问题很清楚。换言之:是需要一个UDF来实现这一点,还是BigQuery标准SQL支持在不需要UDF的情况下取消对字符串化JSON数组的测试?我不清楚为什么这个问题被否决了,而没有提出改进的建议。对于任何在这个问题上绊倒的人来说,这仍然是一个合法的开放问题,尽管Felipe Hoffa的评论中确实包含了一个链接,跟踪这个缺失的功能,如果有人想对它进行投票的话。看起来你有了解决方案-这里的问题是什么?您想要不涉及UDF的解决方案吗?还是别的什么?请澄清-因为我仍然不清楚您突出显示/粗体的内容,请投赞成票。对不起,我认为我的问题很清楚。换言之:是需要一个UDF来实现这一点,还是BigQuery标准SQL支持在不需要UDF的情况下取消对字符串化JSON数组的测试?我不清楚为什么这个问题被否决了,而没有提出改进的建议。对于任何在这一点上绊倒的人来说,这仍然是一个合法的开放问题,尽管Felipe Hoffa的评论中确实包含了一个跟踪此缺失功能的链接,如果有人想对其进行投票的话。这是一个很好的例子,并且示例代码按照预期工作,可以解决问题,而无需求助于UDF。我会用这个踢轮胎的-谢谢!这很好,示例代码的工作原理与预期一样,可以在不依赖UDF的情况下解决问题。我会用这个踢轮胎的-谢谢!