Thanks for your answers!
I added the setAutoFlush to be true....
For "security", I also added table.flushCommits(); after every Put(), and
Delete() call.
And I still get some unpredictable results:
[java] Iteration 0
[java] Before put *Empty result*
[java] After put - before delete
{colfam1,qual1,val}{colfam1,qual2,val}
[java] After second put *Empty result*
[java]
[java]
[java] Iteration 1
[java] Before put *Empty result*
[java] After put - before delete
{colfam1,qual1,val}{colfam1,qual2,val}
[java] After second put *Empty result*
[java]
[java]
[java] Iteration 2
[java] Before put * Empty result*
[java] After put - before delete
{colfam1,qual1,val}{colfam1,qual2,val}
[java] After second put {colfam1,qual1,val}
[java]
[java]
[java] Iteration 3
[java] Before put {colfam1,qual1,val}
[java] After put - before delete
{colfam1,qual1,val}{colfam1,qual2,val}
[java] After second put {colfam1,qual1,val}
[java]
[java]
[java] Iteration 4
[java] Before put {colfam1,qual1,val}
[java] After put - before delete
{colfam1,qual1,val}{colfam1,qual2,val}
[java] After second put {colfam1,qual1,val}
[java]
[java]
[java] Iteration 5
[java] Before put {colfam1,qual1,val}
[java] After put - before delete
{colfam1,qual1,val}{colfam1,qual2,val}
[java] After second put {colfam1,qual1,val}
[java]
[java]
[java] Iteration 6
[java] Before put {colfam1,qual1,val}
[java] After put - before delete
{colfam1,qual1,val}{colfam1,qual2,val}
[java] After second put {colfam1,qual1,val}
[java]
[java]
[java] Iteration 7
[java] Before put {colfam1,qual1,val}
[java] After put - before delete
{colfam1,qual1,val}{colfam1,qual2,val}
[java] After second put *Empty result*
[java]
[java]
[java] Iteration 8
[java] Before put *Empty result*
[java] After put - before delete
{colfam1,qual1,val}{colfam1,qual2,val}
[java] After second put {colfam1,qual1,val}
[java]
[java]
[java] Iteration 9
[java] Before put {colfam1,qual1,val}
[java] After put - before delete
{colfam1,qual1,val}{colfam1,qual2,val}
[java] After second put * Empty result*
On Thu, Nov 20, 2014 at 4:32 PM, Nick Dimiduk <[email protected]> wrote:
> Hit send too soon.
>
> I don't see you calling flush anywhere. Could be the edits are accumulated
> in the local client write buffer but haven't been sent to the store. The
> exact semantics will depend on what version and settings you're running.
>
> Try adding a table.flush() before each call to printTableContent().
>
> On Thu, Nov 20, 2014 at 3:29 PM, Nick Dimiduk <[email protected]> wrote:
>
> > Are you flushing the edits so that they're actually written to the server
> > before you send the gets?
> >
> > On Thu, Nov 20, 2014 at 2:43 PM, Sznajder ForMailingList <
> > [email protected]> wrote:
> >
> >> 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
> >> > >> >
> >> > >>
> >> > >
> >> > >
> >> >
> >>
> >
> >
>