Here is code from 0.94 code base:

  public void mutateRow(final RowMutations rm) throws IOException {
    new ServerCallable<Void>(connection, tableName, rm.getRow(),
        operationTimeout) {
      public Void call() throws IOException {
        server.mutateRow(location.getRegionInfo().getRegionName(), rm);
        return null;

where RowMutations has the following check:

  private void internalAdd(Mutation m) throws IOException {
    int res = Bytes.compareTo(this.row, m.getRow());
    if(res != 0) {
      throw new IOException("The row in the recently added Put/Delete " +
          Bytes.toStringBinary(m.getRow()) + " doesn't match the original
one " +
          Bytes.toStringBinary(this.row));

This means you need to issue multiple mutateRow() calls for different rows.

I think you should consider the potential impact on performance due to this
limitation.

For advanced usage, take a look at MultiRowMutationEndpoint:

 * This class demonstrates how to implement atomic multi row transactions
using
 * {@link HRegion#mutateRowsWithLocks(java.util.Collection,
java.util.Collection)}
 * and Coprocessor endpoints.

Cheers

On Sat, Apr 20, 2013 at 10:11 AM, Kristoffer Sjögren <sto...@gmail.com>wrote:

> Just to absolutely be clear, is this also true for a batch that span
> multiple rows?
>
>
> On Sat, Apr 20, 2013 at 2:42 PM, Ted Yu <yuzhih...@gmail.com> wrote:
>
> > Operations within each batch are atomic.
> > They would either all succeed or all fail.
> >
> > Time stamps would all refer to the latest cell (KeyVal).
> >
> > Cheers
> >
> > On Apr 20, 2013, at 12:17 AM, Kristoffer Sjögren <sto...@gmail.com>
> wrote:
> >
> > > The schema is known beforehand so this is exactly what I need. Great!
> > >
> > > One more question. What guarantees does the batch operation have? Are
> the
> > > operations contained within each batch atomic? I.e. all mutations will
> be
> > > given the same timestamp? If something fails, all operation fail or can
> > it
> > > fail partially?
> > >
> > > Thanks for your help, much appreciated.
> > >
> > > Cheers,
> > > -Kristoffer
> > >
> > >
> > > On Sat, Apr 20, 2013 at 4:47 AM, Ted Yu <yuzhih...@gmail.com> wrote:
> > >
> > >> I don't know details about Kristoffer's schema.
> > >> If all the column qualifiers are known a priori, mutateRow() should
> > serve
> > >> his needs.
> > >>
> > >> HBase allows arbitrary number of columns in a column family. If the
> > schema
> > >> is dynamic, mutateRow() wouldn't suffice.
> > >> If the column qualifiers are known but the row is very wide (and a few
> > >> columns are updated per call), performance would degrade.
> > >>
> > >> Just some factors to consider.
> > >>
> > >> Cheers
> > >>
> > >> On Fri, Apr 19, 2013 at 1:41 PM, Mohamed Ibrahim <
> mibra...@mibrahim.net
> > >>> wrote:
> > >>
> > >>> Actually I do see it in the 0.94 JavaDocs (
> > >>
> >
> http://hbase.apache.org/0.94/apidocs/org/apache/hadoop/hbase/client/HTable.html#mutateRow(org.apache.hadoop.hbase.client.RowMutations)
> > >>> ),
> > >>> so may be it was added in 0.94.6 even though the jira says fixed in
> > 0.95
> > >> .
> > >>> I haven't used it though, but it seems that's what you're looking
> for.
> > >>>
> > >>> Sorry for confusion.
> > >>>
> > >>> Mohamed
> > >>>
> > >>>
> > >>> On Fri, Apr 19, 2013 at 4:35 PM, Mohamed Ibrahim <
> > mibra...@mibrahim.net
> > >>>> wrote:
> > >>>
> > >>>> It seems that 0.95 is not released yet, mutateRow won't be a
> solution
> > >> for
> > >>>> now. I saw it in the downloads and I thought it was released.
> > >>>>
> > >>>>
> > >>>> On Fri, Apr 19, 2013 at 4:18 PM, Mohamed Ibrahim <
> > >> mibra...@mibrahim.net
> > >>>> wrote:
> > >>>>
> > >>>>> Just noticed you want to delete as well. I think that's supported
> > >> since
> > >>>>> 0.95 in mutateRow (
> > >>
> >
> http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/HTable.html#mutateRow(org.apache.hadoop.hbase.client.RowMutations)
> > >> ).
> > >>>>> You can do multiple puts and deletes and they will be performed
> > >>> atomically.
> > >>>>> So you can remove qualifiers and put new ones.
> > >>>>>
> > >>>>> Mohamed
> > >>>>>
> > >>>>>
> > >>>>> On Fri, Apr 19, 2013 at 3:44 PM, Kristoffer Sjögren <
> > sto...@gmail.com
> > >>>> wrote:
> > >>>>>
> > >>>>>> What would you suggest? I want the operation to be atomic.
> > >>>>>>
> > >>>>>>
> > >>>>>> On Fri, Apr 19, 2013 at 8:32 PM, Ted Yu <yuzhih...@gmail.com>
> > wrote:
> > >>>>>>
> > >>>>>>> What is the maximum number of versions do you allow for the
> > >>> underlying
> > >>>>>>> table ?
> > >>>>>>>
> > >>>>>>> Thanks
> > >>>>>>>
> > >>>>>>> On Fri, Apr 19, 2013 at 10:53 AM, Kristoffer Sjögren <
> > >>> sto...@gmail.com
> > >>>>>>>> wrote:
> > >>>>>>>
> > >>>>>>>> Hi
> > >>>>>>>>
> > >>>>>>>> Is it possible to completely overwrite/replace a row in a single
> > >>>>>> _atomic_
> > >>>>>>>> action? Already existing columns and qualifiers should be
> removed
> > >>> if
> > >>>>>> they
> > >>>>>>>> do not exist in the data inserted into the row.
> > >>>>>>>>
> > >>>>>>>> The only way to do this is to first delete the row then insert
> > >> new
> > >>>>>> data
> > >>>>>>> in
> > >>>>>>>> its place, correct? Or is there an operation to do this?
> > >>>>>>>>
> > >>>>>>>> Cheers,
> > >>>>>>>> -Kristoffer
> > >>
> >
>

Reply via email to