请原谅我的无知,但我对hbase还比较陌生,似乎不太明白。我想在hbase中存储以下嵌套哈希Map:
Map<String, Map<String, Map<String, Double>>>
我似乎搞不懂hbase表的模式。
行索引显然是最外层Map中的字符串值。但是,我不认为hbase允许嵌套列族(尽管它允许每个列族有任意数量的列)
同样从这里的答案我发现嵌套实体不能在hbase中有嵌套实体。
要了解数据大小,请执行以下操作:
最里面的Map( Map<String, Double>
)只有3把钥匙。
中间的Map( Map<String, Map<String, Double>>
)大约有100把钥匙。
最外面的Map( Map<String, Map<String, Map<String, Double>>>
)可能有两千万到三千万把钥匙。
感谢您的帮助。
编辑1:基本上,我要存储的数量是针对特定的productid的,从一个特定的仓库跨地方、地区或国家级别销售了多少数量。
productid是最外层Map的键。
仓库ID是中间Map的关键。
本地/区域/国家是最内层Map的关键。
编辑2:将在Map的作业中填充和读取数据。基本上,对于每个产品id,warehouseidx(local/zonal/national:我们现在称之为saletype)数量是另一个操作所需的输入。我还考虑将productid x warehouseid x saletype粒度的数据存储在csv文件中,并从Map的作业中读取
3条答案
按热度按时间s1ag04yj1#
考虑到您的编辑,我将避免使用hbase(尽管我喜欢它)。似乎不需要对数据进行随机访问,在每次迭代时进行全表扫描和全表写入并不是hbase的最佳用途。
我假设你已经有了一个hadoop集群。最好的选择可能是将数据直接以平面格式存储在hdfs中(sequencefile、avro或其他序列化格式)。另外,我不确定您使用哪种工具,但我猜对于基本计数聚合,hive将是一个简单的开始选项)。
ftf50wuq2#
据我所知,您有大量的数据集、分区范围,而且还需要快速检索,因此可以在hdfs上使用parquet格式。它将为您提供一个具有分区和压缩支持的列式存储。您还可以通过spark、drill等任何其他框架读取数据。
zwghvu4y3#
思考这个问题的一种方法是(key1,key2,key3)->双重Map。可以使用键、列族和限定符来描述结构。对于一个非常高的表,可以将键元组的所有3个部分作为一个串联的行\键,尽管这样做效果不太好。
你有多达90亿元组。你对数据很了解。第一个问题是:“您将如何最频繁地查询和访问数据?”如果您正在查找特定的值而不是集合,那么90亿行可能是有意义的。如果不是这样的话,您通常会查找单个外键的所有内部数据,那么最外面的键作为行\u键,以及(中间的)\u(内部的)作为列限定符可能会起作用。在后一种情况下,可以使用带有regex比较器的限定符过滤器来进一步过滤响应。