【问题标题】:BigQuery - Query JSONBigQuery - 查询 JSON
【发布时间】:2018-05-18 14:38:50
【问题描述】:

我以这种格式存储了 JSON:

[{
    "name": "total_video_views",
    "values": [{
        "value": 3720
    }]
}, {
    "name": "total_video_views_unique",
    "values": [{
        "value": 3648
    }]
}]

JSON 文件有更多行,包含许多不同的指标。

如何查询特定指标?

(例如,给我以下值:name = total_video_views_unique

当我知道值在哪个索引时,我可以查询:

SELECT JSON_EXTRACT(<MY_JSON_STRING>, '$[1].name'), JSON_EXTRACT(<MY_JSON_STRING>, '$[1].values[0].value')

谢谢。

【问题讨论】:

    标签: json google-bigquery


    【解决方案1】:

    要克服 JsonPath 的 BigQuery“限制”,您可以使用 custom function,如下例所示:
    它使用 jsonpath-0.8.0.js,可以从 https://code.google.com/archive/p/jsonpath/downloads 下载并上传到 Google Cloud Storage - gs://your_bucket/jsonpath-0.8.0.js

    #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 t AS (
    SELECT '''
    { "store": {
            "book": [ 
                { "category": "reference",
                    "author": "Nigel Rees",
                    "title": "Sayings of the Century",
                    "price": 8.95
                },
                { "category": "fiction",
                    "author": "Evelyn Waugh",
                    "title": "Sword of Honour",
                    "price": 12.99
                },
                { "category": "fiction",
                    "author": "Herman Melville",
                    "title": "Moby Dick",
                    "isbn": "0-553-21311-3",
                    "price": 8.99
                },
                { "category": "fiction",
                    "author": "J. R. R. Tolkien",
                    "title": "The Lord of the Rings",
                    "isbn": "0-395-19395-8",
                    "price": 22.99
                }
            ],
            "bicycle": {
                "color": "red",
                "price": 19.95
            }
        }
    }
    ''' AS x
    )
    SELECT 
        CUSTOM_JSON_EXTRACT(x, '$.store.book[*].author'),
        CUSTOM_JSON_EXTRACT(x, '$..*[?(@.price==22.99)].author'),
        CUSTOM_JSON_EXTRACT(x, '$..author'),
        CUSTOM_JSON_EXTRACT(x, '$.store.*'),
        CUSTOM_JSON_EXTRACT(x, '$.store..price'),
        CUSTOM_JSON_EXTRACT(x, '$..book[(@.length-1)]'),
        CUSTOM_JSON_EXTRACT(x, '$..book[-1:]'),
        CUSTOM_JSON_EXTRACT(x, '$..book[0,1]'),
        CUSTOM_JSON_EXTRACT(x, '$..book[:2]'),
        CUSTOM_JSON_EXTRACT(x, '$..book[?(@.isbn)]')
    FROM t
    

    结果如下

    CUSTOM_JSON_EXTRACT(x, '$.store.book[*].author')

    [
      "Nigel Rees"
      "Evelyn Waugh"
      "Herman Melville"
      "J. R. R. Tolkien"
    ]
    

    CUSTOM_JSON_EXTRACT(x, '$..*[?(@.price==22.99)].author')

    [
      "J. R. R. Tolkien"
    ]  
    

    CUSTOM_JSON_EXTRACT(x, '$.store..price')

    [
      8.95
      12.99
      8.99
      22.99
      19.95
    ]
    

    【讨论】:

    • 听起来不错!我会试一试。谢谢。
    • 当然。当您尝试并且如果它有效/有帮助时回来 - 对答案和接受等进行投票:o)或者如果您喜欢它,您现在可以投票
    【解决方案2】:

    很遗憾,我没有足够清楚地理解您的问题。对于这类问题,我的理解一般有两种答案。

    如果您有想要使用 BigQuery 查询的 JSON 文件,您只需 import the file to BigQuery 即可正常查询。

    如果您的意思是将 JSON 结构存储为列中的字符串,那么仅使用 SQL 查询就不可能动态获取所需节点,因为您需要使用脚本或脚本查看 JSON 对象编程语言。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多