Index: ql/src/test/results/clientpositive/updateAccessTime.q.out =================================================================== --- ql/src/test/results/clientpositive/updateAccessTime.q.out (revision 0) +++ ql/src/test/results/clientpositive/updateAccessTime.q.out (revision 0) @@ -0,0 +1,44 @@ +PREHOOK: query: drop table tstsrc +PREHOOK: type: DROPTABLE +POSTHOOK: query: drop table tstsrc +POSTHOOK: type: DROPTABLE +PREHOOK: query: create table tstsrc as select * from src +PREHOOK: type: CREATETABLE +PREHOOK: Input: default@src +POSTHOOK: query: create table tstsrc as select * from src +POSTHOOK: type: CREATETABLE +POSTHOOK: Input: default@src +POSTHOOK: Output: default@tstsrc +PREHOOK: query: desc extended tstsrc +PREHOOK: type: DESCTABLE +POSTHOOK: query: desc extended tstsrc +POSTHOOK: type: DESCTABLE +key string +value string + +Detailed Table Information Table(tableName:tstsrc, dbName:default, owner:njain, createTime:1291186116, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:key, type:string, comment:null), FieldSchema(name:value, type:string, comment:null)], location:pfile:/data/users/njain/hive1/hive1/build/ql/test/data/warehouse/tstsrc, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}), partitionKeys:[], parameters:{transient_lastDdlTime=1291186116}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE) +PREHOOK: query: select count(1) from tstsrc +PREHOOK: type: QUERY +PREHOOK: Input: default@tstsrc +PREHOOK: Output: file:/tmp/njain/hive_2010-11-30_22-48-36_314_1052733710596331925/-mr-10000 +POSTHOOK: query: select count(1) from tstsrc +POSTHOOK: type: QUERY +POSTHOOK: Input: default@tstsrc +POSTHOOK: Output: file:/tmp/njain/hive_2010-11-30_22-48-36_314_1052733710596331925/-mr-10000 +500 +PREHOOK: query: desc extended tstsrc +PREHOOK: type: DESCTABLE +POSTHOOK: query: desc extended tstsrc +POSTHOOK: type: DESCTABLE +key string +value string + +Detailed Table Information Table(tableName:tstsrc, dbName:default, owner:njain, createTime:1291186116, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:key, type:string, comment:null), FieldSchema(name:value, type:string, comment:null)], location:pfile:/data/users/njain/hive1/hive1/build/ql/test/data/warehouse/tstsrc, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}), partitionKeys:[], parameters:{lastAccessTime=1291186116445, transient_lastDdlTime=1291186116}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE) +PREHOOK: query: drop table tstsrc +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@tstsrc +PREHOOK: Output: default@tstsrc +POSTHOOK: query: drop table tstsrc +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@tstsrc +POSTHOOK: Output: default@tstsrc Index: ql/src/test/queries/clientpositive/updateAccessTime.q =================================================================== --- ql/src/test/queries/clientpositive/updateAccessTime.q (revision 0) +++ ql/src/test/queries/clientpositive/updateAccessTime.q (revision 0) @@ -0,0 +1,9 @@ +drop table tstsrc; + +set hive.exec.pre.hooks = org.apache.hadoop.hive.ql.hooks.PreExecutePrinter,org.apache.hadoop.hive.ql.hooks.EnforceReadOnlyTables,org.apache.hadoop.hive.ql.hooks.UpdateInputAccessTimeHook$PreExec; + +create table tstsrc as select * from src; +desc extended tstsrc; +select count(1) from tstsrc; +desc extended tstsrc; +drop table tstsrc; Index: ql/src/java/org/apache/hadoop/hive/ql/metadata/Partition.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/metadata/Partition.java (revision 1040857) +++ ql/src/java/org/apache/hadoop/hive/ql/metadata/Partition.java (working copy) @@ -461,6 +461,10 @@ return tPartition.getParameters(); } + public void setParameters(Map parameters) { + tPartition.setParameters(parameters); + } + public List getCols() { return tPartition.getSd().getCols(); } Index: ql/src/java/org/apache/hadoop/hive/ql/hooks/UpdateInputAccessTimeHook.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/hooks/UpdateInputAccessTimeHook.java (revision 0) +++ ql/src/java/org/apache/hadoop/hive/ql/hooks/UpdateInputAccessTimeHook.java (revision 0) @@ -0,0 +1,77 @@ +package org.apache.hadoop.hive.ql.hooks; + +import java.util.Set; +import java.util.LinkedHashMap; +import java.util.Map; + +import org.apache.hadoop.hive.conf.HiveConf; +import org.apache.hadoop.hive.ql.session.SessionState; +import org.apache.hadoop.security.UserGroupInformation; +import org.apache.hadoop.hive.ql.metadata.Hive; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.metadata.Partition; +import org.apache.hadoop.hive.ql.metadata.Table; + +/** + * Implementation of a pre execute hook that updates the access + * times for all the inputs. + */ +public class UpdateInputAccessTimeHook { + + private static final String LAST_ACCESS_TIME = "lastAccessTime"; + + public static class PreExec implements PreExecute { + Hive db; + + /* Initialize the database */ + public PreExec() throws Exception { + } + + private Map modifyParams(Map old_map, String key, String value) { + Map new_map = old_map; + if (new_map == null) + new_map = new LinkedHashMap(); + new_map.put(key, value); + return new_map; + } + + public void run(SessionState sess, Set inputs, + Set outputs, UserGroupInformation ugi) + throws Exception { + + if (db == null) { + try { + db = Hive.get(sess.getConf()); + } catch (HiveException e) { + // ignore + db = null; + return; + } + } + + //Go over the input paths and check if they are archived or not + for(ReadEntity re: inputs) { + // Set the last query time + ReadEntity.Type typ = re.getType(); + switch(typ) { + case TABLE: + Table t = re.getTable(); + t.setProperty(LAST_ACCESS_TIME, + Long.toString(System.currentTimeMillis())); + // t.setParameters(modifyParams(t.getParameters(), LAST_ACCESS_TIME, + // Long.toString(System.currentTimeMillis()))); + db.alterTable(t.getTableName(), t); + break; + case PARTITION: + Partition p = re.getPartition(); + p.setParameters(modifyParams(p.getParameters(), LAST_ACCESS_TIME, + Long.toString(System.currentTimeMillis()))); + db.alterPartition(p.getTable().getTableName(), p); + break; + default: + throw new Exception("Unknown type for input: " + re.toString()); + } + } + } + } +}