HBase improvements - Added row-deletion functionality, also made HBaseDataContext implement UpdateableDataContext
Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/0ffeeb20 Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/0ffeeb20 Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/0ffeeb20 Branch: refs/heads/master Commit: 0ffeeb20af4d58061d042bb6ebccafb2ab7d6502 Parents: f2d2ff2 Author: Gerard Dellemann <[email protected]> Authored: Tue May 1 14:34:36 2018 +0200 Committer: Gerard Dellemann <[email protected]> Committed: Tue May 1 14:34:36 2018 +0200 ---------------------------------------------------------------------- .../metamodel/hbase/HBaseDataContext.java | 13 ++++- .../org/apache/metamodel/hbase/HBaseRow.java | 5 -- .../hbase/HBaseRowDeletionBuilder.java | 50 ++++++++++++++++++++ .../metamodel/hbase/HBaseUpdateCallback.java | 25 ++++++++-- .../org/apache/metamodel/hbase/HBaseWriter.java | 19 ++++++-- 5 files changed, 97 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metamodel/blob/0ffeeb20/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java ---------------------------------------------------------------------- diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java index 841b225..b913ca0 100644 --- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java +++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java @@ -35,6 +35,9 @@ import org.apache.hadoop.hbase.filter.PageFilter; import org.apache.metamodel.DataContext; import org.apache.metamodel.MetaModelException; import org.apache.metamodel.QueryPostprocessDataContext; +import org.apache.metamodel.UpdateScript; +import org.apache.metamodel.UpdateSummary; +import org.apache.metamodel.UpdateableDataContext; import org.apache.metamodel.data.DataSet; import org.apache.metamodel.data.DataSetHeader; import org.apache.metamodel.data.Row; @@ -53,7 +56,7 @@ import org.slf4j.LoggerFactory; /** * MetaModel adaptor for Apache HBase. */ -public class HBaseDataContext extends QueryPostprocessDataContext { +public class HBaseDataContext extends QueryPostprocessDataContext implements UpdateableDataContext { private static final Logger logger = LoggerFactory.getLogger(HBaseDataContext.class); @@ -243,4 +246,12 @@ public class HBaseDataContext extends QueryPostprocessDataContext { private void setMaxRows(Scan scan, int maxRows) { scan.setFilter(new PageFilter(maxRows)); } + + @Override + public UpdateSummary executeUpdate(UpdateScript update) { + final HBaseUpdateCallback callback = new HBaseUpdateCallback(this); + update.run(callback); + + return callback.getUpdateSummary(); + } } http://git-wip-us.apache.org/repos/asf/metamodel/blob/0ffeeb20/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRow.java ---------------------------------------------------------------------- diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRow.java b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRow.java index 2820602..79267da 100644 --- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRow.java +++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRow.java @@ -61,11 +61,6 @@ final class HBaseRow extends AbstractRow implements Row { } final int colonIndex = name.indexOf(':'); if (colonIndex != -1) { - /* - * I think this is DEATH code! The first line of this method: implementation - * _header.getSelectItem(index).getColumn() will always return only a columnfamily with our current - * implementations. - */ byte[] family = name.substring(0, colonIndex).getBytes(); byte[] qualifier = name.substring(colonIndex + 1).getBytes(); byte[] value = _result.getValue(family, qualifier); http://git-wip-us.apache.org/repos/asf/metamodel/blob/0ffeeb20/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowDeletionBuilder.java ---------------------------------------------------------------------- diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowDeletionBuilder.java b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowDeletionBuilder.java new file mode 100644 index 0000000..925537a --- /dev/null +++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowDeletionBuilder.java @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.metamodel.hbase; + +import org.apache.metamodel.MetaModelException; +import org.apache.metamodel.delete.AbstractRowDeletionBuilder; +import org.apache.metamodel.schema.Table; + +public class HBaseRowDeletionBuilder extends AbstractRowDeletionBuilder { + + private HBaseUpdateCallback _updateCallback; + private Object _key; + + public HBaseRowDeletionBuilder(HBaseUpdateCallback updateCallback, Table table) { + super(table); + if (updateCallback == null) { + throw new IllegalArgumentException("UpdateCallback cannot be null"); + } + _updateCallback = updateCallback; + + } + + @Override + public void execute() throws MetaModelException { + if (_key == null) { + throw new IllegalArgumentException("Key cannot be null"); + } + _updateCallback.deleteRow((HBaseTable) getTable(), _key); + } + + public void setKey(Object _key) { + this._key = _key; + } +} http://git-wip-us.apache.org/repos/asf/metamodel/blob/0ffeeb20/hbase/src/main/java/org/apache/metamodel/hbase/HBaseUpdateCallback.java ---------------------------------------------------------------------- diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseUpdateCallback.java b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseUpdateCallback.java index 6cc1522..39670db 100644 --- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseUpdateCallback.java +++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseUpdateCallback.java @@ -79,11 +79,10 @@ public class HBaseUpdateCallback extends AbstractUpdateCallback implements Updat @Override public RowInsertionBuilder insertInto(Table table) throws IllegalArgumentException, IllegalStateException, UnsupportedOperationException { - throw new UnsupportedOperationException("Use insertInto(String tableName, HBaseColumn[] outputColumns)"); + throw new UnsupportedOperationException("Use insertInto(Table table, HBaseColumn[] outputColumns)"); } - public HBaseRowInsertionBuilder insertInto(Table table, HBaseColumn[] columns) - throws IllegalArgumentException { + public HBaseRowInsertionBuilder insertInto(Table table, HBaseColumn[] columns) throws IllegalArgumentException { if (table instanceof HBaseTable) { return new HBaseRowInsertionBuilder(this, (HBaseTable) table, columns); } @@ -107,7 +106,25 @@ public class HBaseUpdateCallback extends AbstractUpdateCallback implements Updat @Override public RowDeletionBuilder deleteFrom(Table table) throws IllegalArgumentException, IllegalStateException, UnsupportedOperationException { - throw new UnsupportedOperationException(); + throw new UnsupportedOperationException( + "Use deleteFrom(HBaseUpdateCallback updateCallback, Table table, Object key)"); + } + + public HBaseRowDeletionBuilder deleteFrom(HBaseUpdateCallback updateCallback, Table table) + throws IllegalArgumentException { + if (table instanceof HBaseTable) { + return new HBaseRowDeletionBuilder(this, (HBaseTable) table); + } + throw new IllegalArgumentException("Not an HBase table: " + table); + } + + protected synchronized void deleteRow(HBaseTable hBaseTable, Object key) { + try { + final HBaseWriter HbaseWriter = new HBaseWriter(HBaseDataContext.createConfig(_configuration)); + HbaseWriter.deleteRow(hBaseTable, key); + } catch (IOException e) { + e.printStackTrace(); + } } public HBaseConfiguration getConfiguration() { http://git-wip-us.apache.org/repos/asf/metamodel/blob/0ffeeb20/hbase/src/main/java/org/apache/metamodel/hbase/HBaseWriter.java ---------------------------------------------------------------------- diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseWriter.java b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseWriter.java index f8897da..ad63597 100644 --- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseWriter.java +++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseWriter.java @@ -30,17 +30,17 @@ import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.Delete; +import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Table; import org.apache.hadoop.hbase.util.Bytes; import org.apache.metamodel.MetaModelException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public final class HBaseWriter extends Configured { - static final byte[] INFO_COLUMNFAMILY = Bytes.toBytes("info"); - static final byte[] NAME_QUALIFIER = Bytes.toBytes("name"); - static final byte[] LOCATION_QUALIFIER = Bytes.toBytes("location"); - static final byte[] DESCRIPTION_QUALIFIER = Bytes.toBytes("description"); + private static final Logger logger = LoggerFactory.getLogger(HBaseWriter.class); private final Connection _connection; @@ -86,7 +86,11 @@ public final class HBaseWriter extends Configured { try { Table table = _connection.getTable(TableName.valueOf(hBaseTable.getName())); try { - table.delete(new Delete(Bytes.toBytes(key.toString()))); + if (rowExists(table, key) == true) { + table.delete(new Delete(Bytes.toBytes(key.toString()))); + } else { + logger.warn("Rowkey with value " + key.toString() + " doesn't exist in the table"); + } } finally { table.close(); } @@ -95,6 +99,11 @@ public final class HBaseWriter extends Configured { } } + private boolean rowExists(Table table, Object key) throws IOException { + Get get = new Get(Bytes.toBytes(key.toString())); + return (table.get(get).isEmpty()) == true ? false : true; + } + public void createTable(String tableName, Set<String> columnFamilies) throws IOException { try { // Create table
