| /** |
| * 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.hcatalog.mapreduce; |
| |
| import java.io.IOException; |
| import java.io.Serializable; |
| |
| import org.apache.hadoop.hive.metastore.MetaStoreUtils; |
| import org.apache.hadoop.hive.metastore.api.Table; |
| import org.apache.hcatalog.common.HCatUtil; |
| import org.apache.hcatalog.data.schema.HCatSchema; |
| |
| /** |
| * |
| * HCatTableInfo - class to communicate table information to {@link HCatInputFormat} |
| * and {@link HCatOutputFormat} |
| * |
| */ |
| public class HCatTableInfo implements Serializable { |
| |
| |
| private static final long serialVersionUID = 1L; |
| |
| /** The db and table names */ |
| private final String databaseName; |
| private final String tableName; |
| |
| /** The table schema. */ |
| private final HCatSchema dataColumns; |
| private final HCatSchema partitionColumns; |
| |
| /** The table being written to */ |
| private final Table table; |
| |
| /** The storer info */ |
| private StorerInfo storerInfo; |
| |
| /** |
| * Initializes a new HCatTableInfo instance to be used with {@link HCatInputFormat} |
| * for reading data from a table. |
| * work with hadoop security, the kerberos principal name of the server - else null |
| * The principal name should be of the form: |
| * <servicename>/_HOST@<realm> like "hcat/_HOST@myrealm.com" |
| * The special string _HOST will be replaced automatically with the correct host name |
| * @param databaseName the db name |
| * @param tableName the table name |
| * @param dataColumns schema of columns which contain data |
| * @param partitionColumns schema of partition columns |
| * @param storerInfo information about storage descriptor |
| * @param table hive metastore table class |
| */ |
| HCatTableInfo( |
| String databaseName, |
| String tableName, |
| HCatSchema dataColumns, |
| HCatSchema partitionColumns, |
| StorerInfo storerInfo, |
| Table table) { |
| this.databaseName = (databaseName == null) ? MetaStoreUtils.DEFAULT_DATABASE_NAME : databaseName; |
| this.tableName = tableName; |
| this.dataColumns = dataColumns; |
| this.table = table; |
| this.storerInfo = storerInfo; |
| this.partitionColumns = partitionColumns; |
| } |
| |
| /** |
| * Gets the value of databaseName |
| * @return the databaseName |
| */ |
| public String getDatabaseName() { |
| return databaseName; |
| } |
| |
| /** |
| * Gets the value of tableName |
| * @return the tableName |
| */ |
| public String getTableName() { |
| return tableName; |
| } |
| |
| /** |
| * @return return schema of data columns as defined in meta store |
| */ |
| public HCatSchema getDataColumns() { |
| return dataColumns; |
| } |
| |
| /** |
| * @return schema of partition columns |
| */ |
| public HCatSchema getPartitionColumns() { |
| return partitionColumns; |
| } |
| |
| /** |
| * @return the storerInfo |
| */ |
| public StorerInfo getStorerInfo() { |
| return storerInfo; |
| } |
| |
| public String getTableLocation() { |
| return table.getSd().getLocation(); |
| } |
| |
| /** |
| * minimize dependency on hive classes so this is package private |
| * this should eventually no longer be used |
| * @return hive metastore representation of table |
| */ |
| Table getTable() { |
| return table; |
| } |
| |
| /** |
| * create an HCatTableInfo instance from the supplied Hive Table instance |
| * @param table to create an instance from |
| * @return HCatTableInfo |
| * @throws IOException |
| */ |
| static HCatTableInfo valueOf(Table table) throws IOException { |
| // Explicitly use {@link org.apache.hadoop.hive.ql.metadata.Table} when getting the schema, |
| // but store @{link org.apache.hadoop.hive.metastore.api.Table} as this class is serialized |
| // into the job conf. |
| org.apache.hadoop.hive.ql.metadata.Table mTable = |
| new org.apache.hadoop.hive.ql.metadata.Table(table); |
| HCatSchema schema = HCatUtil.extractSchema(mTable); |
| StorerInfo storerInfo = |
| InternalUtil.extractStorerInfo(table.getSd(), table.getParameters()); |
| HCatSchema partitionColumns = HCatUtil.getPartitionColumns(mTable); |
| return new HCatTableInfo(table.getDbName(), table.getTableName(), schema, |
| partitionColumns, storerInfo, table); |
| } |
| |
| @Override |
| public boolean equals(Object o) { |
| if (this == o) return true; |
| if (o == null || getClass() != o.getClass()) return false; |
| |
| HCatTableInfo tableInfo = (HCatTableInfo) o; |
| |
| if (dataColumns != null ? !dataColumns.equals(tableInfo.dataColumns) : tableInfo.dataColumns != null) |
| return false; |
| if (databaseName != null ? !databaseName.equals(tableInfo.databaseName) : tableInfo.databaseName != null) |
| return false; |
| if (partitionColumns != null ? !partitionColumns.equals(tableInfo.partitionColumns) : tableInfo.partitionColumns != null) |
| return false; |
| if (storerInfo != null ? !storerInfo.equals(tableInfo.storerInfo) : tableInfo.storerInfo != null) return false; |
| if (table != null ? !table.equals(tableInfo.table) : tableInfo.table != null) return false; |
| if (tableName != null ? !tableName.equals(tableInfo.tableName) : tableInfo.tableName != null) return false; |
| |
| return true; |
| } |
| |
| |
| @Override |
| public int hashCode() { |
| int result = databaseName != null ? databaseName.hashCode() : 0; |
| result = 31 * result + (tableName != null ? tableName.hashCode() : 0); |
| result = 31 * result + (dataColumns != null ? dataColumns.hashCode() : 0); |
| result = 31 * result + (partitionColumns != null ? partitionColumns.hashCode() : 0); |
| result = 31 * result + (table != null ? table.hashCode() : 0); |
| result = 31 * result + (storerInfo != null ? storerInfo.hashCode() : 0); |
| return result; |
| } |
| |
| } |
| |