我正在寻找有关如何最好地存储某些数据的意见。我有一些类似于以下的数据:
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
的示例。我们将有以下两种选择……
{"category1": "1", "proportion1": "0.99", "category2": "7", "proportion2": "0.85"}
{"category1": {"label": "1", "proportion": "0.99"}, "category2": {"label": "7", "proportion": "0.85"}}
我对Presto / Athena中的json不太熟悉。用例将包括:a)在给定特定类别标签的情况下查找ID ,或b)通过各个类别标签对ID属性进行分组。
例如,我可能想识别属于category = 3的所有id。我认为,在雅典娜中,这两种结构都不容易。
正在寻找您可能有的反馈。我确实认为最佳结构是每个ID +类别组合一行,但这不是此用例的选择。
答案 0 :(得分:0)
我认为,开始使用的表格格式比建议的JSON结构更可取。您始终可以使用SQL来获取其他格式,因此,除非您有非常具体的要求,否则选择对访问模式的假设最少,看起来最像表格的格式通常是最好的,除非您有非常具体的要求
最后,它还很大程度上取决于您将如何生成数据。雅典娜(Athena)的美丽之处在于它非常擅长处理您可以扔给它的大多数结构。保持数据以其产生的格式,您几乎总是可以使用SQL来获得所需的答案。如果结果太慢或太昂贵,您可以使用Athena将数据转换为更合适的其他格式和结构,但也始终将数据保持其原始格式–这样,您就可以始终创建更多数据新情况的版本。
如果数据不是太多,您还可以使用视图为不同的用例创建优化的表示形式。
答案 1 :(得分:0)
数据建模应尽可能从查询访问模式派生。但是,如果您不了解所有模式,那么只需考虑以下几点:
在这里,您可以将id和category存储为两个单独的列,以便支持按id或category查询。
Athena只是Presto之上的包装器,可提供更少的服务器SQL产品。本质上,数据存储在s3对象存储中,Presto处理引擎将在每次处理之前获取数据。您也可以使用Rubix缓存热数据,以避免每次读取s3。