代码之家  ›  专栏  ›  技术社区  ›  jamiet

bigquery中的jsonpath不支持@for filter。关于替代方案的建议?

  •  0
  • jamiet  · 技术社区  · 7 年前

    https://jsonpath.curiousconcept.com/ 使用此JSON文档:

    [{
        "key": "name",
        "value": "john doe"
    }, {
        "key": "age",
        "value": "8"
    }, {
        "key": "gender",
        "value": "male"
    }]
    

    我可以使用JsonPath表达式 $[?(@.key=="age")].value 提取价值 ["8"] 这就是我想要的。

    但是,当我尝试在bigquery中使用相同的JsonPath时,就像这样:

    select JSON_EXTRACT_SCALAR('[{"key": "name","value": "john-doe"}, {"key": "age","value": "8"}, {"key": "gender","value": "male"}]', '$[?(@.key=="age")].value')

    我有个错误

    JSONPath中不支持的运算符:@

    关于如何在bigquery中实现这一点有什么建议吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   marc_s    6 年前

    下面是BigQuery标准SQL

    #standardSQL
    CREATE TEMPORARY FUNCTION CUSTOM_JSON_EXTRACT(json STRING, json_path STRING)
    RETURNS STRING
    LANGUAGE js AS """
        try { var parsed = JSON.parse(json);
            return JSON.stringify(jsonPath(parsed, json_path));
        } catch (e) { return null }
    """
    OPTIONS (
        library="gs://your_bucket/jsonpath-0.8.0.js"
    );
    WITH `project.dataset.your_table` AS (
      SELECT '''
        [{
            "key": "name",
            "value": "john doe"
        }, {
            "key": "age",
            "value": "8"
        }, {
            "key": "gender",
            "value": "male"
        }]  
          ''' str
    )
    SELECT CUSTOM_JSON_EXTRACT(str, '$[?(@.key=="age")].value')
    FROM `project.dataset.your_table`  
    

    注意:您需要将jsonpath-0.8.0.js库上传到云存储上的存储桶中。它可以从 https://code.google.com/archive/p/jsonpath/downloads .

    上面的方法克服了JsonPath的BigQuery“限制”,现在可以使用所有“常规”JsonPath特性

        2
  •  0
  •   jamiet    7 年前

    不幸的是不得不求助于regex:(

    select regexp_extract('[{"key": "name","value": "john-doe"}, {"key": "age","value": "8"}, {"key": "gender","value": "male"}]', r'"key": "age","value": "([^,:]+)"')

    我之所以说“不幸”,是因为我认为JsonPath将是实现这一目标的更优雅的方法。