Sure
Here is the sample code I used for testing.
The call Delete and then Put return some weird content : some times the
table is just... empty!
Benjamin
package db.hbase;
import java.io.IOException;
import java.util.List;
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.KeyValue;
import org.apache.hadoop.hbase.TableExistsException;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.util.Bytes;
public class HBaseStandaloneTest {
private final static String NAME =
"dummy-test-"+System.currentTimeMillis();
private final static byte[] ROW1 = Bytes.toBytes("row1");
private final static byte[] COLFAM1 = Bytes.toBytes("colfam1");
private final static byte[] QUAL1 = Bytes.toBytes("qual1");
private final static byte[] QUAL2 = Bytes.toBytes("qual2");
private final static byte[] VAL = Bytes.toBytes("val");
private static final String HBASE_CONFIGURATION_ZOOKEEPER_QUORUM =
"hbase.zookeeper.quorum";
private static final String HBASE_CONFIGURATION_ZOOKEEPER_CLIENTPORT =
"hbase.zookeeper.property.clientPort";
private static HTable table;
private static HBaseAdmin admin;
private static void init() throws IOException {
Configuration conf = HBaseConfiguration.create();
conf.set(HBASE_CONFIGURATION_ZOOKEEPER_QUORUM, IP_ADRESS);
conf.set(HBASE_CONFIGURATION_ZOOKEEPER_CLIENTPORT, "2181");
admin = new HBaseAdmin(conf);
try {
if (admin.tableExists(NAME)) {
admin.disableTable(NAME);
admin.deleteTable(NAME);
}
} catch (Exception e ) {
//
}
HTableDescriptor desc = new HTableDescriptor(NAME);
HColumnDescriptor coldef = new
HColumnDescriptor(Bytes.toString(COLFAM1));
desc.addFamily(coldef);
try {
admin.createTable(desc);
} catch (TableExistsException e) {
System.err.println("table \'" + NAME + "\' already exists");
}
table = new HTable(conf, NAME);
}
private static void testUpdateRows() throws Exception{
for (int i = 0 ; i < 10; i++) {
System.out.println("\n\nIteration " + i);
printTableContent("Before put");
putRow1Version1();
printTableContent("After put - before delete");
deleteRow1();
//printTableContent("After delete - before 2nd put");
putRow1Version2();
printTableContent("After second put");
}
}
private static void putRow1Version2() throws Exception {
Put put = new Put(ROW1);
put.add(COLFAM1, QUAL1, VAL);
table.put(put);
}
private static void deleteRow1() throws Exception {
Delete del = new Delete(ROW1);
table.delete(del);
}
private static void putRow1Version1() throws Exception {
Put put = new Put(ROW1);
put.add(COLFAM1, QUAL1, VAL);
put.add(COLFAM1, QUAL2, VAL);
table.put(put);
}
private static void printTableContent(String str) throws IOException {
System.out.print((str+"
").substring(0,30));
Result res = table.get(new Get(ROW1));
List<KeyValue> list = res.list();
if (list == null) {
System.out.println("\t\tEmpty result");
} else {
StringBuilder strBlder = new StringBuilder();
for (KeyValue keyVal : list) {
String fam = Bytes.toString(keyVal.getFamily());
String qual = Bytes.toString(keyVal.getQualifier());
String data =
Bytes.toString(res.getValue(keyVal.getFamily(), keyVal.getQualifier()));
strBlder.append("{"+ fam + "," + qual + "," + data +"}");
}
System.out.println("\t\t"+strBlder.toString());
}
}
public static void main(String[] args) throws Exception {
init();
try {
testUpdateRows();
} finally {
cleanup();
}
}
private static void cleanup() throws IOException {
table.close();
admin.disableTable(NAME);
admin.deleteTable(NAME);
}
}
On Thu, Nov 20, 2014 at 1:48 PM, Nick Dimiduk <[email protected]> wrote:
> Attachements are filtered from the list. Please include a link if you'd
> like to share some attachment.
>
> On Thu, Nov 20, 2014 at 11:46 AM, Sznajder ForMailingList <
> [email protected]> wrote:
>
> > Hi Nick
> >
> > Many thanks for your rapid answer!
> >
> > By "unpredictable results", I mean that I do not get the expected value
> in
> > the row, after the new Put call (after Delete).
> >
> > I tried to call a delete before a put (see the attached file)
> >
> > And I get some weird results: after iterations, I start to get some
> "empty
> > content".
> >
> > Apparently, "Delete" and "Put" on a same key are not well supported....
> >
> > Benjamin
> >
> > On Thu, Nov 20, 2014 at 11:40 AM, Nick Dimiduk <[email protected]>
> wrote:
> >
> >> What does "unpredictable results" mean? If you know all the existing
> >> qualifiers, just provide new values of all of them in a single put. If
> you
> >> don't, you can use a delete family marker to clear visibility of an
> entire
> >> family. I think you'll need to do this separately from writing the new
> >> values.
> >>
> >> On Thu, Nov 20, 2014 at 9:17 AM, Sznajder ForMailingList <
> >> [email protected]> wrote:
> >>
> >> > Hi,
> >> >
> >> > I would like to **replace** the whole content of a Row in HBase by
> some
> >> new
> >> > content.
> >> > However:
> >> > * Simple *put* call just replaces the cells in the new put row.
> >> > * I thought to call Delete and then Put, and I get some very
> >> unpredictable
> >> > results...
> >> >
> >> > Is there a solution for replacing the whole content of a Row?
> >> >
> >> > Many thanks!
> >> >
> >> > Benjamin
> >> >
> >>
> >
> >
>