在 hive/hbase 中更新查询
update query in hive/hbase
我已经使用 hive 在 hbase 中创建了一个 table:
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");
并创建了另一个 table 来加载数据:
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;
最后插入数据到hbasetable:
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)
table 在 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
现在我正在尝试更新此 table 中的一个值
例如,我想将 "Ram" 的 "role" 从 "Teamlead" 更改为 "Member",
我应该使用哪个查询?
假设您正在尝试覆盖以前的值,从 hbase shell 您可以 运行 以下内容:
put 'emp', 123, 'cf1:role', Member', 1422540225254
如果您的目标是覆盖,请务必使用与上一个条目相同的时间戳。
从 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 进行大量导入和数据分析。
我已经使用 hive 在 hbase 中创建了一个 table:
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");
并创建了另一个 table 来加载数据:
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;
最后插入数据到hbasetable:
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)
table 在 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
现在我正在尝试更新此 table 中的一个值 例如,我想将 "Ram" 的 "role" 从 "Teamlead" 更改为 "Member", 我应该使用哪个查询?
假设您正在尝试覆盖以前的值,从 hbase shell 您可以 运行 以下内容:
put 'emp', 123, 'cf1:role', Member', 1422540225254
如果您的目标是覆盖,请务必使用与上一个条目相同的时间戳。
从 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 进行大量导入和数据分析。