You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by st...@apache.org on 2007/12/11 18:07:15 UTC

svn commit: r603304 - in /lucene/hadoop/trunk/src/contrib/hbase: ./ src/java/org/apache/hadoop/hbase/ src/java/org/apache/hadoop/hbase/shell/

Author: stack
Date: Tue Dec 11 09:07:12 2007
New Revision: 603304

URL: http://svn.apache.org/viewvc?rev=603304&view=rev
Log:
HADOOP-2395 Implement "ALTER TABLE ... CHANGE column" operation

Modified:
    lucene/hadoop/trunk/src/contrib/hbase/CHANGES.txt
    lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HBaseAdmin.java
    lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HMaster.java
    lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HMasterInterface.java
    lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/AlterCommand.java
    lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/HelpCommand.java
    lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/SchemaModificationCommand.java

Modified: lucene/hadoop/trunk/src/contrib/hbase/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/CHANGES.txt?rev=603304&r1=603303&r2=603304&view=diff
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/CHANGES.txt (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/CHANGES.txt Tue Dec 11 09:07:12 2007
@@ -15,6 +15,8 @@
     HADOOP-1550 No means of deleting a'row' (Bryan Duxbuery via Stack)
     HADOOP-2384 Delete all members of a column family on a specific row
                 (Bryan Duxbury via Stack)
+    HADOOP-2395 Implement "ALTER TABLE ... CHANGE column" operation
+                (Bryan Duxbury via Stack)
 
   OPTIMIZATIONS
 

Modified: lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HBaseAdmin.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HBaseAdmin.java?rev=603304&r1=603303&r2=603304&view=diff
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HBaseAdmin.java (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HBaseAdmin.java Tue Dec 11 09:07:12 2007
@@ -479,6 +479,31 @@
       throw RemoteExceptionHandler.decodeRemoteException(e);
     }
   }
+
+  /**
+   * Modify an existing column family on a table
+   * 
+   * @param tableName name of table
+   * @param columnName name of column to be modified
+   * @param descriptor new column descriptor to use
+   * @throws IOException
+   */
+  public void modifyColumn(Text tableName, Text columnName, 
+    HColumnDescriptor descriptor)
+  throws IOException {
+    if (this.master == null) {
+      throw new MasterNotRunningException("master has been shut down");
+    }
+    
+    checkReservedTableName(tableName);
+    try {
+      this.master.modifyColumn(tableName, columnName, descriptor);
+      
+    } catch (RemoteException e) {
+      throw RemoteExceptionHandler.decodeRemoteException(e);
+    }
+  }
+
   
   /** 
    * Shuts down the HBase instance 

Modified: lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HMaster.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HMaster.java?rev=603304&r1=603303&r2=603304&view=diff
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HMaster.java (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HMaster.java Tue Dec 11 09:07:12 2007
@@ -2636,6 +2636,13 @@
   }
 
   /** {@inheritDoc} */
+  public void modifyColumn(Text tableName, Text columnName, 
+    HColumnDescriptor descriptor)
+  throws IOException {
+    new ModifyColumn(tableName, columnName, descriptor).process();
+  }
+
+  /** {@inheritDoc} */
   public void deleteColumn(Text tableName, Text columnName) throws IOException {
     new DeleteColumn(tableName, HStoreKey.extractFamily(columnName)).process();
   }
@@ -3075,6 +3082,41 @@
       }
     }
   }
+
+  /** Instantiated to modify an existing column family on a table */
+  private class ModifyColumn extends ColumnOperation {
+    private HColumnDescriptor descriptor;
+    private Text columnName;
+    
+    ModifyColumn(Text tableName, Text columnName, HColumnDescriptor _descriptor) 
+      throws IOException {
+      super(tableName);
+      this.descriptor = _descriptor;
+      this.columnName = columnName;
+    }
+
+    @Override
+    protected void postProcessMeta(MetaRegion m, HRegionInterface server)
+      throws IOException {
+
+      for (HRegionInfo i: unservedRegions) {
+        // get the column families map from the table descriptor
+        Map<Text, HColumnDescriptor> families = i.getTableDesc().families();
+        
+        // if the table already has this column, then put the new descriptor 
+        // version.
+        if (families.get(columnName) != null){
+          families.put(columnName, descriptor);
+          updateRegionInfo(server, m.getRegionName(), i);          
+        }
+        else{ // otherwise, we have an error.
+          throw new IOException("Column family '" + columnName + 
+            "' doesn't exist, so cannot be modified.");
+        }
+      }
+    }
+  }
+
 
   /*
    * Managing leases

Modified: lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HMasterInterface.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HMasterInterface.java?rev=603304&r1=603303&r2=603304&view=diff
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HMasterInterface.java (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HMasterInterface.java Tue Dec 11 09:07:12 2007
@@ -61,6 +61,18 @@
   public void addColumn(Text tableName, HColumnDescriptor column) throws IOException;
 
   /**
+   * Modifies an existing column on the specified table
+   * @param tableName
+   * @param columnName name of the column to edit
+   * @param descriptor new column descriptor
+   * @throws IOException
+   */
+  public void modifyColumn(Text tableName, Text columnName, 
+    HColumnDescriptor descriptor) 
+  throws IOException;
+
+
+  /**
    * Deletes a column from the specified table
    * @param tableName
    * @param columnName

Modified: lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/AlterCommand.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/AlterCommand.java?rev=603304&r1=603303&r2=603304&view=diff
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/AlterCommand.java (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/AlterCommand.java Tue Dec 11 09:07:12 2007
@@ -28,10 +28,14 @@
 import org.apache.hadoop.hbase.HBaseAdmin;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HColumnDescriptor;
+import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.HConnection;
 import org.apache.hadoop.hbase.HConnectionManager;
 import org.apache.hadoop.io.Text;
 
+import org.apache.hadoop.hbase.BloomFilterDescriptor;
+import org.apache.hadoop.hbase.BloomFilterDescriptor.BloomFilterType;
+
 /**
  * Alters tables.
  */
@@ -79,8 +83,29 @@
           enableTable(admin, tableName);
           break;
         case CHANGE:
-          // Not yet supported
-          return new ReturnMsg(0, "" + operationType + " is not yet supported.");
+          disableTable(admin, tableName);
+          
+          Map.Entry<String, Map<String, Object>> columnEntry = 
+            (Map.Entry<String, Map<String, Object>>)columnSpecMap.entrySet().toArray()[0];
+
+          // add the : if there isn't one
+          Text columnName = new Text(columnEntry.getKey().endsWith(":") ? 
+            columnEntry.getKey() : columnEntry.getKey() + ":");
+          
+          // get the table descriptor so we can get the old column descriptor
+          HTableDescriptor tDesc = getTableDescByName(admin, tableName);
+          HColumnDescriptor oldColumnDesc = tDesc.families().get(columnName);
+
+          // combine the options specified in the shell with the options 
+          // from the exiting descriptor to produce the new descriptor
+          columnDesc = getColumnDescriptor(columnName.toString(), 
+            columnEntry.getValue(), oldColumnDesc);
+          
+          // send the changes out to the master
+          admin.modifyColumn(new Text(tableName), columnName, columnDesc);
+          
+          enableTable(admin, tableName);
+          break;
         case NOOP:
           return new ReturnMsg(0, "Invalid operation type.");
       }
@@ -141,4 +166,84 @@
   public CommandType getCommandType() {
     return CommandType.DDL;
   }
+  
+  private HTableDescriptor getTableDescByName(HBaseAdmin admin, String tableName)
+  throws IOException{
+    HTableDescriptor[] tables = admin.listTables();
+    for(HTableDescriptor tDesc : tables){
+      if (tDesc.getName().toString().equals(tableName)) {
+        return tDesc;
+      }
+    }
+    return null;
+  }
+  
+  /**
+   * Given a column name, column spec, and original descriptor, returns an 
+   * instance of HColumnDescriptor representing the column spec, with empty
+   * values drawn from the original as defaults
+   */
+  protected HColumnDescriptor getColumnDescriptor(String column,
+    Map<String, Object> columnSpec, HColumnDescriptor original) 
+  throws IllegalArgumentException {
+    initOptions(original);
+
+    Set<String> specs = columnSpec.keySet();
+    for (String spec : specs) {
+      spec = spec.toUpperCase();
+
+      if (spec.equals("MAX_VERSIONS")) {
+        maxVersions = (Integer) columnSpec.get(spec);
+      } else if (spec.equals("MAX_LENGTH")) {
+        maxLength = (Integer) columnSpec.get(spec);
+      } else if (spec.equals("COMPRESSION")) {
+        compression = HColumnDescriptor.CompressionType
+            .valueOf(((String) columnSpec.get(spec)).toUpperCase());
+      } else if (spec.equals("IN_MEMORY")) {
+        inMemory = (Boolean) columnSpec.get(spec);
+      } else if (spec.equals("BLOOMFILTER")) {
+        bloomFilterType = BloomFilterType.valueOf(((String) columnSpec.get(spec))
+            .toUpperCase());
+      } else if (spec.equals("VECTOR_SIZE")) {
+        vectorSize = (Integer) columnSpec.get(spec);
+      } else if (spec.equals("NUM_HASH")) {
+        numHash = (Integer) columnSpec.get(spec);
+      } else if (spec.equals("NUM_ENTRIES")) {
+        numEntries = (Integer) columnSpec.get(spec);
+      } else {
+        throw new IllegalArgumentException("Invalid option: " + spec);
+      }
+    }
+
+    // Now we gather all the specified options for this column.
+    if (bloomFilterType != null) {
+      if (specs.contains("NUM_ENTRIES")) {
+        bloomFilterDesc = new BloomFilterDescriptor(bloomFilterType, numEntries);
+      } else {
+        bloomFilterDesc = new BloomFilterDescriptor(bloomFilterType, vectorSize,
+            numHash);
+      }
+    }
+
+    column = appendDelimiter(column);
+
+    HColumnDescriptor columnDesc = new HColumnDescriptor(new Text(column),
+        maxVersions, compression, inMemory, maxLength, bloomFilterDesc);
+
+    return columnDesc;
+  }
+
+  private void initOptions(HColumnDescriptor original) {
+    if (original == null) {
+      initOptions();
+      return;
+    }
+    maxVersions = original.getMaxVersions();
+    maxLength = original.getMaxValueLength();
+    compression = original.getCompression();
+    inMemory = original.isInMemory();
+    bloomFilterDesc = original.getBloomFilter();
+  }
+
+  
 }

Modified: lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/HelpCommand.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/HelpCommand.java?rev=603304&r1=603303&r2=603304&view=diff
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/HelpCommand.java (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/HelpCommand.java Tue Dec 11 09:07:12 2007
@@ -116,6 +116,7 @@
         "Alter structure of table",
         "ALTER TABLE table_name ADD column_spec | "
             + "ADD (column_spec, column_spec, ...) | "
+            + "CHANGE column_family column_spec | "
             + "DROP column_family_name | " + "CHANGE column_spec;" });
 
     load.put("EXIT", new String[] { "Exit shell", "EXIT;" });

Modified: lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/SchemaModificationCommand.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/SchemaModificationCommand.java?rev=603304&r1=603303&r2=603304&view=diff
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/SchemaModificationCommand.java (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/SchemaModificationCommand.java Tue Dec 11 09:07:12 2007
@@ -33,21 +33,21 @@
  * Command. Provides utility methods for alteration operations.
  */
 public abstract class SchemaModificationCommand extends BasicCommand {
-  private int maxVersions;
-  private int maxLength;
-  private HColumnDescriptor.CompressionType compression;
-  private boolean inMemory;
-  private BloomFilterDescriptor bloomFilterDesc;
-  private BloomFilterType bloomFilterType;
-  private int vectorSize;
-  private int numHash;
-  private int numEntries;
+  protected int maxVersions;
+  protected int maxLength;
+  protected HColumnDescriptor.CompressionType compression;
+  protected boolean inMemory;
+  protected BloomFilterDescriptor bloomFilterDesc;
+  protected BloomFilterType bloomFilterType;
+  protected int vectorSize;
+  protected int numHash;
+  protected int numEntries;
 
   public SchemaModificationCommand(Writer o) {
     super(o);
   }
 
-  private void initOptions() {
+  protected void initOptions() {
     maxVersions = HColumnDescriptor.DEFAULT_N_VERSIONS;
     maxLength = HColumnDescriptor.DEFAULT_MAX_VALUE_LENGTH;
     compression = HColumnDescriptor.DEFAULT_COMPRESSION_TYPE;