BigQuery 架构:重复记录与记录

问题描述

我有以下数据(下面的示例),由 3 个模式表示,我想将这些数据存储到 bq (bigquery) 中。

  1. 架构 1

        {
         "id": 1,"age": 64,"tags": [
            {"FirstName": "Tom"},{"LastName": "Hanks"},{"Country": "USA"}
         ]
        }
    
  2. Schema2

        {
         "id": 1,"tags": {
            "FirstName": "Tom","LastName": "Hanks","Country": "USA"
         }
        }
    
  3. 架构 3

        {
         "id": 1,"tags": [
            {"key": "FirstName","value": "Tom"},{"key": "LastName","value": "Hanks"},{"key": "Country","value": "USA"}
         ]
        }
    

我的用例是我希望能够按这些标签值对记录进行分组/过滤。

  1. Schema1 和 Schema3 将需要 UNnesT 对维度上的任何过滤/分组进行,因此 Schema2 将是此类查询的最快
  2. 存储空间不是问题,尽管 Schema2 可能是最有效的,其次是 Schema1 和 Schema3
  3. 只有 Schema3 支持使用新键对表进行增量更新。

我的问题是:

  1. 如果我们知道所有可能的键并事先定义 Schema,那么 Schema2 似乎是最好的选择。是否有理由支持 Schema1 而不是 Schema2?
  2. 对于动态标签,Schema3 似乎是最佳选择? 是否有其他模式或我在上面尚未考虑的因素?

解决方法

来自BigQuery documentation

BigQuery 不支持 JSON 格式的地图或字典,因为 纯 JSON 字典中可能缺少模式信息。为了 例如,表示购物车中的产品列表 "products":{"my_product": 40.0,"product2" : 16.5} 无效,但 "products":[{"product_name": "my_product","amount": 40.0},{"product_name": "product2","amount": 16.5}] 有效。

因此,缺乏架构似乎是 BigQuery 中的一个重要问题。因此,回答您的问题:

  1. 是否有理由支持 Schema1 而不是 Schema2?

编辑:您可以使用 schema2,但请注意它是否使用“标准”字段正确非规范化。

  1. 对于动态标签,Schema3 似乎是最佳选择?是否有其他模式或我在上面尚未考虑的因素?

Schema3 似乎是动态标签的唯一解决方案。