Google bigquery BigQuery中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

我有一个表,其中包含一个字符串列,其中包含JSON对象的字符串化列表,如下所示:

'[{"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的情况下解决问题。我会用这个踢轮胎的-谢谢!