我已经使用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"到"会员", 我应该使用哪个查询?
答案 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用于大量进口和数据分析。