在hive / hbase中更新查询

时间:2015-01-30 14:32:28

标签: hadoop hive hbase

我已经使用hive在hbase中创建了一个表:

hive> CREATE TABLE hbase_table_emp(id int, name string, role string) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:name,cf1:role")
TBLPROPERTIES ("hbase.table.name" = "emp");

并创建另一个表来加载数据:

hive> create table testemp(id int, name string, role string) row format delimited fields terminated by '\t';
hive> load data local inpath '/home/user/sample.txt' into table testemp;

最后将数据插入到hbase表中:

hive> insert overwrite table hbase_table_emp select * from testemp;
hive> select * from hbase_table_emp;
OK
123 Ram     TeamLead
456 Silva   Member
789 Krishna Member
time taken: 0.160 seconds, Fetched: 3 row(s)

这个表在hbase中是这样的:

hbase(main):002:0> scan 'emp'
ROW                   COLUMN+CELL                                               
 123                  column=cf1:name, timestamp=1422540225254, value=Ram       
 123                  column=cf1:role, timestamp=1422540225254, value=TeamLead  
 456                  column=cf1:name, timestamp=1422540225254, value=Silva     
 456                  column=cf1:role, timestamp=1422540225254, value=Member    
 789                  column=cf1:name, timestamp=1422540225254, value=Krishna      
 789                  column=cf1:role, timestamp=1422540225254, value=Member    
3 row(s) in 2.1230 seconds

现在我尝试更新此表中的值 例如,我想改变"角色" " Ram"来自" Teamlead"到"会员", 我应该使用哪个查询?

2 个答案:

答案 0 :(得分:2)

假设您尝试覆盖之前的值,可以从hbase shell运行以下命令:

put 'emp', 123, 'cf1:role', Member', 1422540225254

如果你的目标是覆盖,那么使用与前一个条目相同的时间戳非常重要。

答案 1 :(得分:1)

自v0.14以来你可以用HIVE做到:

INSERT INTO TABLE hbase_table_emp VALUES (123, null, "Member");

你必须提供你想要更新的密钥和你不想更新的字段的空值...是的,这很奇怪,比如必须为单个更新编译和运行MapReduce作业,但是假装HIVE + HBase像常规RDBMS一样工作并在此过程中提供完整的ACID支持也很奇怪:)

为了更新数据,我会坚持使用HBase(Stargate,Thrift,Native甚至是hbase shell)提供的API,并将HIVE用于大量进口和数据分析。