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

时间:2019-05-24 19:17:42

标签: 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只能驻留一行。

现在,我一直在考虑两个json结构。考虑id = 1的示例。我们将有以下两种选择……

  1. 未嵌套:{"category1": "1", "proportion1": "0.99", "category2": "7", "proportion2": "0.85"}
  2. 嵌套:{"category1": {"label": "1", "proportion": "0.99"}, "category2": {"label": "7", "proportion": "0.85"}}

我对Presto / Athena中的json不太熟悉。用例将包括:a)在给定特定类别标签的情况下查找ID ,或b)通过各个类别标签对ID属性进行分组

例如,我可能想识别属于category = 3的所有id。我认为,在雅典娜中,这两种结构都不容易。

正在寻找您可能有的反馈。我确实认为最佳结构是每个ID +类别组合一行,但这不是此用例的选择。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

  • 尝试使用非规范化表以避免多次连接
  • 通过JSON / CSV使用Parquet / ORC文件格式
  • 在您的情况下,Parquet在查找嵌套数据结构时可能会更好,但请确保不要查询嵌套结构的那些子字段,以避免性能问题。

在这里,您可以将id和category存储为两个单独的列,以便支持按id或category查询。

Athena只是Presto之上的包装器,可提供更少的服务器SQL产品。本质上,数据存储在s3对象存储中,Presto处理引擎将在每次处理之前获取数据。您也可以使用Rubix缓存热数据,以避免每次读取s3。