Json 在单列中存储可变长度数据的最佳方法

Json 在单列中存储可变长度数据的最佳方法,json,presto,amazon-athena,Json,Presto,Amazon Athena,我正在寻找一些关于如何最好地存储一些数据的意见。我有一些类似以下的数据: id category proportion 1 1 0.99 1 7 0.85 2 1 0.55 3 2 0.90 3 3 0.85 基本上,唯一ID可以属于不同数量的类别。每个id和类别都有一个与其关联的比例 我希望将这些数据存储在一列中,以便将其添加到一个表中,其中每个id

我正在寻找一些关于如何最好地存储一些数据的意见。我有一些类似以下的数据:

id  category    proportion
1   1           0.99
1   7           0.85
2   1           0.55
3   2           0.90
3   3           0.85        
基本上,唯一ID可以属于不同数量的类别。每个id和类别都有一个与其关联的比例

我希望将这些数据存储在一列中,以便将其添加到一个表中,其中每个id只能驻留在一行中

现在,我一直在考虑两种json结构。考虑<代码> ID=1 < /代码>的例子。我们有以下两种选择

  • 未列出:
    {“类别1”:“1”,“比例1”:“0.99”,“类别2”:“7”,“比例2”:“0.85”}
  • 嵌套:
    {“category1”:{“label”:“1”,“比例”:“0.99”},“category2”:{“label”:“7”,“比例”:“0.85”}
  • 我不太熟悉Presto/Athena中的json。用例包括a)查找给定特定类别标签的id,或b)按单个类别标签对id属性进行分组

    例如,我可能希望标识属于category=3的所有id。我不认为这两种结构中的任何一种都会使雅典娜的这件事变得容易


    寻找您可能有的任何反馈。我确实认为最佳结构是每个id+类别组合一行,但这不是本用例的选项

    我认为您开始使用的表格格式比您建议的JSON结构更可取。您总是可以使用SQL获取其他格式,因此选择对访问模式做出最少假设、看起来最像表的格式通常是最好的,除非您有非常具体的要求——听起来不像您有

    最后,这在很大程度上取决于您将如何生成数据。雅典娜的美妙之处在于它能很好地处理你能扔给它的大多数结构。保持数据的生成格式,您几乎可以始终使用SQL来获得所需的答案。如果结果太慢或太贵,您可以使用Athena将数据转换为更合适的其他格式和结构,但也要始终保持数据的原始格式,这样您就可以为新情况创建更多版本


    如果数据不太多,您也可以使用视图为不同的用例创建优化的表示。

    我认为您开始使用的表格格式比您建议的JSON结构更可取。您总是可以使用SQL获取其他格式,因此选择对访问模式做出最少假设、看起来最像表的格式通常是最好的,除非您有非常具体的要求——听起来不像您有

    最后,这在很大程度上取决于您将如何生成数据。雅典娜的美妙之处在于它能很好地处理你能扔给它的大多数结构。保持数据的生成格式,您几乎可以始终使用SQL来获得所需的答案。如果结果太慢或太贵,您可以使用Athena将数据转换为更合适的其他格式和结构,但也要始终保持数据的原始格式,这样您就可以为新情况创建更多版本


    如果数据不太多,您也可以使用视图为不同的用例创建优化的表示。

    数据建模应尽可能从查询访问模式派生。但是,如果您不了解所有模式,那么有几点需要考虑:

    • 尝试使用非规范化的表来避免许多联接
    • 在JSON/CSV上使用拼花地板/ORC文件格式
    • 在您的情况下,Parquet可能会更好,因为您正在寻找嵌套的数据结构,但请确保您没有查询嵌套结构的那些子字段,以避免性能问题
    在这里,您可以将id和category存储为两个单独的列,以便支持按id或category进行查询


    Athena只是Presto之上的一个包装器,用于提供无服务器SQL产品。基本上,数据存储在s3对象存储器中,每次处理之前,Presto处理引擎都会获取数据。您还可以使用Rubix缓存热数据,以避免每次s3读取。

    数据建模应尽可能从查询访问模式派生。但是,如果您不了解所有模式,那么有几点需要考虑:

    • 尝试使用非规范化的表来避免许多联接
    • 在JSON/CSV上使用拼花地板/ORC文件格式
    • 在您的情况下,Parquet可能会更好,因为您正在寻找嵌套的数据结构,但请确保您没有查询嵌套结构的那些子字段,以避免性能问题
    在这里,您可以将id和category存储为两个单独的列,以便支持按id或category进行查询


    Athena只是Presto之上的一个包装器,用于提供无服务器SQL产品。基本上,数据存储在s3对象存储器中,每次处理之前,Presto处理引擎都会获取数据。您还可以使用Rubix缓存热数据,以避免每次都读取s3。

    是否有理由将其放在json中或希望重新构造数据?为什么不保持您列出的表格格式呢?这是多少数据?我也会保留上面的格式。如果您决定沿着这条路走下去,那么需要注意的是,JSON的处理成本非常高。它只是引擎的一个文本块,每次读取都必须对其进行解析。相反,如果您使用数组、贴图或行等结构类型的组合,引擎可以直接处理数据。感谢各位的反馈。我决定采用我所提到的理想格式创建表,并在另一个表中添加了一个引用,用户可以使用该引用创建表