问题描述
我有以下数据(下面的示例),由 3 个模式表示,我想将这些数据存储到 bq (bigquery) 中。
-
架构 1
{ "id": 1,"age": 64,"tags": [ {"FirstName": "Tom"},{"LastName": "Hanks"},{"Country": "USA"} ] }
-
Schema2
{ "id": 1,"tags": { "FirstName": "Tom","LastName": "Hanks","Country": "USA" } }
-
架构 3
{ "id": 1,"tags": [ {"key": "FirstName","value": "Tom"},{"key": "LastName","value": "Hanks"},{"key": "Country","value": "USA"} ] }
我的用例是我希望能够按这些标签值对记录进行分组/过滤。
- Schema1 和 Schema3 将需要 UNnesT 对维度上的任何过滤/分组进行,因此 Schema2 将是此类查询的最快
- 存储空间不是问题,尽管 Schema2 可能是最有效的,其次是 Schema1 和 Schema3
- 只有 Schema3 支持使用新键对表进行增量更新。
我的问题是:
- 如果我们知道所有可能的键并事先定义 Schema,那么 Schema2 似乎是最好的选择。是否有理由支持 Schema1 而不是 Schema2?
- 对于动态标签,Schema3 似乎是最佳选择? 是否有其他模式或我在上面尚未考虑的因素?
解决方法
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 中的一个重要问题。因此,回答您的问题:
- 是否有理由支持 Schema1 而不是 Schema2?
编辑:您可以使用 schema2,但请注意它是否使用“标准”字段正确非规范化。
- 对于动态标签,Schema3 似乎是最佳选择?是否有其他模式或我在上面尚未考虑的因素?
Schema3 似乎是动态标签的唯一解决方案。