在HBase中存储嵌套的HashMap

时间:2016-09-28 17:38:12

标签: hbase bigtable bigdata

请原谅我的无知,但我对HBase来说相对较新,似乎无法弄明白。我想在HBase中存储以下嵌套的HashMap:

Map<String, Map<String, Map<String, Double>>> 

我似乎无法弄清楚HBase表的架构。

行索引显然是最外层Map中的字符串值。但是,我不认为HBase允许嵌套列系列(尽管每列系列允许任意数量的列)

同样从答案here我发现嵌套实体在HBase中不能有嵌套实体。

为了让您了解数据大小: 1)最里面的Map(Map<String, Double>)只有3个键。 2)中间地图(Map<String, Map<String, Double>>)将有大约100个键。 3)最外面的地图(Map<String, Map<String, Map<String, Double>>>)可能有大约2千万到3千万个密钥。

感谢任何帮助。

编辑1: 基本上,我想要存储的数量是针对特定productId,从特定仓库跨本地,区域或国家级别销售的数量。 productId是最外层Map的关键。 warehouseID是中间Map的关键。 本地/区域/国家是最内层地图的关键。

编辑2: 将在mapred作业中填充和读取数据。基本上对于每个产品ID,仓库ID x(本地/区域/国家:现在称其为saleType)数量是另一个操作的输入所必需的。我还想在csv文件中以productId x warehouseId x saleType粒度存储数据,并从mapred作业中读取它

3 个答案:

答案 0 :(得分:2)

鉴于你的编辑,我会避免使用HBase(尽管我喜欢它)。您似乎不需要随机访问您的数据,并且在每次迭代时执行全表扫描和全表写入都不是HBase的最佳用法。

我假设您已经拥有Hadoop集群。最佳选择可能是直接以HDFS(A SequenceFileAvro或其他序列化格式)将数据以平面格式存储。另外,我不确定你使用什么样的工具,但我猜测对于基本计数聚合,那么Hive将是一个简单的启动选项。)

答案 1 :(得分:1)

考虑这个问题的一种方法是(key1,key2,key3) - &gt;双地图。您可以使用键,列族和限定符来描述结构。您可以将关键元组的所有3个部分作为连接的row_key放在一个非常高的表中,尽管这样做不会很好。

你有多达90亿元组。您对数据有很好的了解。我将从那里得到的第一个问题是:&#34;您将如何最常查询和访问数据?&#34;如果您正在寻找特定值而不是集合,那么大概90亿行是有意义的。如果更频繁,那么,您正在寻找单个外键的所有内部数据,然后可能最外面的键作为row_key,而(中间)_(内部)作为列限定符可以工作。在后一种情况下,您可以使用QualifierFilter和正则表达式比较器来进一步过滤响应。

答案 2 :(得分:0)

据我所知,您拥有大型数据集,分区范围以及快速检索,因此您可以在HDFS上使用parquet格式。 这将为您提供具有分区和压缩支持的柱状存储。 您还可以通过任何其他框架(如spark,drill等)读取数据。