用于将JSON加载到Google BigQuery的架构

时间:2015-08-14 13:26:46

标签: google-bigquery

假设我有以下JSON,这是从日志文件中解析urls参数的结果。

{
    "title": "History of Alphabet",
    "author": [
        {
            "name": "Larry"
        },
    ]
}

{
    "title": "History of ABC",
}

{
    "number_pages": "321",
    "year": "1999",
}

{
    "title": "History of XYZ",
    "author": [
        {
            "name": "Steve",
            "age": "63"
        },
        {
            "nickname": "Bill",
            "dob": "1955-03-29"
        }
    ]
}

顶级所有字段,"标题","作者"," number_pages","年"是可选的。第二级中的字段也是如此,例如#34;作者"。

将JSON加载到BQ时,如何为此JSON制作架构?

相关问题: 例如,假设有另一个类似的表,但数据来自不同的日期,因此可能有不同的模式。是否可以跨这两个表进行查询?

1 个答案:

答案 0 :(得分:2)

  

将JSON加载到BQ时,如何为此JSON制作架构?

以下架构应该有效。您可能想要更改某些类型(例如,您可能希望dob字段为TIMESTAMP而不是STRING),但一般结构应该类似。由于默认情况下类型为NULLABLE,因此所有这些字段都应该处理不存在给定行。

[
    {
        "name": "title",
        "type": "STRING"
    },
    {
        "name": "author",
        "type": "RECORD",
        "fields": [
            {
                "name": "name",
                "type": "STRING"
            },
            {
                "name": "age",
                "type": "STRING"
            },
            {
                "name": "nickname",
                "type": "STRING"
            },
            {
                "name": "dob",
                "type": "STRING"
            }
        ]
    },
    {
        "name": "number_pages",
        "type": "INTEGER"
    },
    {
        "name": "year",
        "type": "INTEGER"
    }
]
  

一个相关的问题:例如,假设有另一个类似的表,但数据来自不同的日期,因此可能有不同的模式。是否可以跨这两个表进行查询?

应该可以将具有不同模式的两个表联合起来而不会有太多困难。

以下是一个关于它如何在公共数据上工作的快速示例(一种愚蠢的例子,因为这些表包含共同的零字段,但显示了这个概念):

SELECT * FROM 
    (SELECT * FROM publicdata:samples.natality), 
    (SELECT * FROM publicdata:samples.shakespeare) 
LIMIT 100;

请注意,每个表周围都需要SELECT *,否则查询会抱怨不同的模式。