如何在bigquery中使用jsonpath bigquery获取json数组属性的所有值?不支持星号运算符.

Ela*_*une 5 google-bigquery

我试图从json数组中获取某个属性的所有值.考虑到以下json,我试图获得所有类型,例如iPhone,家庭

{
 "firstName": "John",
 "lastName" : "doe",
 "age"      : 26,
 "address"  :
 {
     "streetAddress": "naist street",
     "city"         : "Nara",
     "postalCode"   : "630-0192"
 },
 "phoneNumbers":
 [
     {
       "type"  : "iPhone",
       "number": "0123-4567-8888"
     },
     {
       "type"  : "home",
       "number": "0123-4567-8910"
     }
 ]
}
Run Code Online (Sandbox Code Playgroud)

我正在使用$.phoneNumbers[*].type它似乎在在线解析器上正常工作, 但当我在大查询中使用它时:

select json_extract(my_column,'$.phoneNumbers[*].type')
from my_table
Run Code Online (Sandbox Code Playgroud)

我明白了:

JSONPath parse error at: [*].type
Run Code Online (Sandbox Code Playgroud)

Fel*_*ffa 7

您可以编写Javascript UDF来进行提取:

SELECT JSON_EXTRACT('[1,2,3]', '$[*]') parsed 
Error: Unsupported operator in JSONPath: *
Run Code Online (Sandbox Code Playgroud)

UDF替代方案:

#standardSQL
CREATE TEMPORARY FUNCTION parseJson(libs STRING)
    RETURNS ARRAY<INT64>
    LANGUAGE js AS """
      try {
        return JSON.parse(libs);
      } catch (e) {
        return [];
      }
    """;
SELECT parseJson('[1,2,3]') parsed 
Run Code Online (Sandbox Code Playgroud)

更复杂的例子:

#standardSQL
CREATE TEMPORARY FUNCTION parseJson(libs STRING)
    RETURNS ARRAY<STRUCT<x INT64, y INT64, z INT64>>
    LANGUAGE js AS """
      try {
        return JSON.parse(libs);
      } catch (e) {
        return [];
      }
    """;
SELECT parseJson(JSON_EXTRACT('{"a":[{"x":1},{"y":2},{"z":3}]}', '$.a')) parsed 
Run Code Online (Sandbox Code Playgroud)

(灵感来自:https://discuss.httparchive.org/t/javascript-library-detection/955)


Mos*_*sky 5

json_extract不能返回REPEATED字段,它只能做一个匹配 - 因此不支持*