You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "Lars Hofhansl (JIRA)" <ji...@apache.org> on 2013/08/03 06:55:50 UTC
[jira] [Comment Edited] (HBASE-9115) HTableInterface.append
operation may overwrites values
[ https://issues.apache.org/jira/browse/HBASE-9115?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13728449#comment-13728449 ]
Lars Hofhansl edited comment on HBASE-9115 at 8/3/13 4:54 AM:
--------------------------------------------------------------
We are sorting, it does not matter how it is implemented.
Sorting should be O(n*log\(n)). Collections.sort as O\(n) complexity when the data is sorted and is better than n*log\(n) when the data is partially sorted.
Why invent our own sorting when we have support for this in the JDK.
Or... If the List in question question here would be a sorted set (using KVComparator) then we just add to that set and we're done.
was (Author: lhofhansl):
We are sorting, it does not matter how it is implemented.
Sorting should be O(n*log(n)). Collections.sort as O(n) complexity when the data is sorted and is better than n*log(n) when the data is partially sorted.
Why invent our own sorting when we have support for this in the JDK.
Or... If the List in question question here would be a sorted set (using KVComparator) then we just add to that set and we're done.
> HTableInterface.append operation may overwrites values
> ------------------------------------------------------
>
> Key: HBASE-9115
> URL: https://issues.apache.org/jira/browse/HBASE-9115
> Project: HBase
> Issue Type: Bug
> Affects Versions: 0.94.10
> Environment: MAC OS X 10.8.4, Hbase in the pseudo-distributed mode, hadoop v1.2.0, Hbase Java API based client.
> *hdfs-site.xml*:
> {code:xml}
> <configuration>
> <property>
> <name>dfs.replication</name>
> <value>1</value>
> </property>
> <property>
> <name>dfs.support.append</name>
> <value>true</value>
> </property>
> </configuration>
> {code}
> *hbase-site.xml*:
> {code:xml}
> <configuration>
> <property>
> <name>hbase.rootdir</name>
> <value>hdfs://localhost:9000/hbase</value>
> </property>
> <property>
> <name>hbase.cluster.distributed</name>
> <value>true</value>
> </property>
> <property>
> <name>hbase.zookeeper.quorum</name>
> <value>localhost</value>
> </property>
> <property>
> <name>dfs.support.append</name>
> <value>true</value>
> </property>
> </configuration>
> {code}
> Reporter: Aleksandr B
> Assignee: Ted Yu
> Priority: Critical
> Fix For: 0.98.0, 0.95.2, 0.94.11
>
> Attachments: 9115-0.94.txt, 9115-0.94-v2.txt, 9115-trunk.addendum, 9115-trunk.txt
>
>
> I use Hbase Java API and I try to append values Bytes.toBytes("one two") and Bytes.toBytes(" three") in 3 columns.
> Only for 2 out of these 3 columns the result is "one two three".
> *Output from the hbase shell:*
> {noformat}
> hbase(main):008:0* scan "mytesttable"
> ROW COLUMN+CELL
> mytestRowKey column=TestA:dlbytes, timestamp=1375436156140, value=one two three
> mytestRowKey column=TestA:tbytes, timestamp=1375436156140, value=one two three
> mytestRowKey column=TestA:ulbytes, timestamp=1375436156140, value= three
> 1 row(s) in 0.0280 seconds
> {noformat}
> *My test code:*
> {code:title=Database.java|borderStyle=solid}
> import static org.junit.Assert.*;
> import java.io.IOException;
>
> import org.apache.hadoop.conf.Configuration;
> import org.apache.hadoop.hbase.HBaseConfiguration;
> import org.apache.hadoop.hbase.HColumnDescriptor;
> import org.apache.hadoop.hbase.HTableDescriptor;
> import org.apache.hadoop.hbase.client.HBaseAdmin;
> import org.apache.hadoop.hbase.client.HTableInterface;
> import org.apache.hadoop.hbase.client.HTablePool;
> import org.apache.hadoop.hbase.client.Append;
> import org.apache.hadoop.hbase.client.Result;
> import org.apache.hadoop.hbase.util.Bytes;
> import org.junit.Test;
> ...
> @Test
> public void testAppend() throws IOException {
> byte [] rowKey = Bytes.toBytes("mytestRowKey");
> byte [] column1 = Bytes.toBytes("ulbytes");
> byte [] column2 = Bytes.toBytes("dlbytes");
> byte [] column3 = Bytes.toBytes("tbytes");
> String part11 = "one two";
> String part12 = " three";
> String cFamily = "TestA";
> String TABLE = "mytesttable";
> Configuration conf = HBaseConfiguration.create();
> HTablePool pool = new HTablePool(conf, 10);
> HBaseAdmin admin = new HBaseAdmin(conf);
>
> if(admin.tableExists(TABLE)){
> admin.disableTable(TABLE);
> admin.deleteTable(TABLE);
> }
>
> HTableDescriptor tableDescriptor = new HTableDescriptor(TABLE);
> HColumnDescriptor hcd = new HColumnDescriptor(cFamily);
> hcd.setMaxVersions(1);
> tableDescriptor.addFamily(hcd);
> admin.createTable(tableDescriptor);
> HTableInterface table = pool.getTable(TABLE);
>
> Append a = new Append(rowKey);
> a.setReturnResults(false);
> a.add(Bytes.toBytes(cFamily), column1, Bytes.toBytes(part11));
> a.add(Bytes.toBytes(cFamily), column2, Bytes.toBytes(part11));
> a.add(Bytes.toBytes(cFamily), column3, Bytes.toBytes(part11));
> table.append(a);
> a = new Append(rowKey);
> a.add(Bytes.toBytes(cFamily), column1, Bytes.toBytes(part12));
> a.add(Bytes.toBytes(cFamily), column2, Bytes.toBytes(part12));
> a.add(Bytes.toBytes(cFamily), column3, Bytes.toBytes(part12));
> Result result = table.append(a);
> byte [] resultForColumn1 = result.getValue(Bytes.toBytes(cFamily), column1);
> byte [] resultForColumn2 = result.getValue(Bytes.toBytes(cFamily), column2);
> byte [] resultForColumn3 = result.getValue(Bytes.toBytes(cFamily), column3);
> if (resultForColumn1 == null || resultForColumn2 == null || resultForColumn3 == null)
> System.out.println("The DB table contains these values but they are never given back, strange...");
> else {
> assertEquals(0, Bytes.compareTo(Bytes.toBytes(part11 + part12),
> resultForColumn1));
> assertEquals(0, Bytes.compareTo(Bytes.toBytes(part11 + part12),
> resultForColumn2));
> assertEquals(0, Bytes.compareTo(Bytes.toBytes(part11 + part12),
> resultForColumn3));
> }
> HTable t = new HTable(conf, TABLE);
> Get getOperation = new Get(rowKey);
> getOperation.addColumn(Bytes.toBytes(cFamily), column1);
> Result res = t.get(getOperation);
> assertEquals(0, Bytes.compareTo(Bytes.toBytes(part11 + part12), res.getValue(Bytes.toBytes(cFamily), column1)));
> }
> {code}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira