如何在redshift上对嵌套的json数据建模以查询特定的neseted属性

时间:2016-11-13 16:32:38

标签: amazon-redshift

我在S3上有以下JSON文件结构:

{
  "userId": "1234",
  "levelA": {
    "LevelB": [
      {
        "bssid": "University",
        "timestamp": "153301355685"
      },
      {
        "bssid": "Mall",
        "timestamp": "153301355688"
      }
    ]
  }
}

现在我们未来的一个查询是:

返回看到bssid = University

的用户总数

所以在我的情况下,它将返回1(因为userId = 1234包含bssid的值)

对于这种类型的查询,Redshift对我来说是正确的解决方案吗?如果是这样的话,我该如何建模呢?

1 个答案:

答案 0 :(得分:2)

对此进行建模的最简单方法是为userIdbssd的每个组合创建一个包含一行的表格:

userId, bssid, timestamp
1234,University,153301355685
1234,Mall,153301355688

困难的部分是将您的JSON(包含在多个文件中)转换为适合Redshift的格式。

虽然Amazon Redshift可以import data in JSON format,但它无法处理嵌套数据中的一对多关系。

Amazon Redshift还有一个JSON_EXTRACT_PATH_TEXT Function可以从JSON字符串中提取数据,但它也不会处理数据中的一对多关系。

在加载到Redshift之前,我建议将数据转换为为上述格式。这需要使用外部脚本或ETL工具完成。

如果您经常生成此类文件,只要其中一个文件存储在Amazon S3存储桶中,一种合适的方法就是触发 AWS Lambda函数。 Lambda函数然后将解析文件并输出CSV格式,准备加载到Redshift。