HBase为Scala / Java API中的同一行键存储具有2个或更多值的特定列的数据

时间:2017-02-24 22:50:32

标签: scala hbase java-api

我有一个包含以下内容的文件:

UserID   Email             
1001     abc@yahoo.com     
1001     def@gmail.com     
1002     gft@gmail.com
1002     rtf@yahoo.com

我想存储这样的数据:

ROW          COLUMN+CELL                                                                                   
1001         column=cf:Email, timestamp=1487917201278, value=abc@yahoo.com 
1001         column=cf:Email, timestamp=1487917201279, value=def@gmail.com                                                                                                
1002         column=cf:Email, timestamp=1487917201286, value=gft@gmail.com
1002         column=cf:Email, timestamp=1487917201287, value=rtf@yahoo.com

我正在使用Put例如:put 'table', '1001', 'cf:Email', 'def@gmail.com'但它正在给我

ROW          COLUMN+CELL                                                                                    
1001         column=cf:Email, timestamp=1487917201279, value=def@gmail.com                                                                                                
1002         column=cf:Email, timestamp=1487917201286, value=rtf@yahoo.com

它覆盖了之前的值。但是HBase应该根据时间戳为特定列存储多个值。 无论如何我可以存储特定UserID的两个电子邮件地址吗?

2 个答案:

答案 0 :(得分:1)

您需要指定" cf"的版本数量。列族。默认情况下,版本数为1。 在HBase shell中执行以下操作以修改现有表:

  

更改'表',{NAME => ' cf',VERSIONS => 2147483647}

详细了解HBase here中的版本。

答案 1 :(得分:1)

您可能需要仔细查看the HBase documentation on versions。特别注意它所说的

  

默认情况下,即如果您未指定显式版本,则在执行get时,将返回版本具有最大值的单元格

但我不会尝试使用多个版本以这种方式存储多个值。您必须明确指定最大版本数,它将应用于该系列中的每个列。我更倾向于使用不同的列名称(例如Email1Email2,...)