| /** |
| * 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.api; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.apache.hadoop.fs.Path; |
| import org.apache.hadoop.hive.metastore.MetaStoreUtils; |
| import org.apache.hadoop.hive.metastore.Warehouse; |
| import org.apache.hadoop.hive.metastore.api.FieldSchema; |
| import org.apache.hadoop.hive.metastore.api.MetaException; |
| import org.apache.hadoop.hive.metastore.api.Partition; |
| import org.apache.hadoop.hive.metastore.api.StorageDescriptor; |
| import org.apache.hadoop.hive.metastore.api.Table; |
| import org.apache.hcatalog.common.HCatException; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| /** |
| * The Class HCatAddPartitionDesc helps users in defining partition attributes. |
| */ |
| public class HCatAddPartitionDesc { |
| |
| private static final Logger LOG = LoggerFactory.getLogger(HCatAddPartitionDesc.class); |
| private String tableName; |
| private String dbName; |
| private String location; |
| private Map<String, String> partSpec; |
| |
| private HCatAddPartitionDesc(String dbName, String tbl, String loc, Map<String, String> spec) { |
| this.dbName = dbName; |
| this.tableName = tbl; |
| this.location = loc; |
| this.partSpec = spec; |
| } |
| |
| /** |
| * Gets the location. |
| * |
| * @return the location |
| */ |
| public String getLocation() { |
| return this.location; |
| } |
| |
| |
| /** |
| * Gets the partition spec. |
| * |
| * @return the partition spec |
| */ |
| public Map<String, String> getPartitionSpec() { |
| return this.partSpec; |
| } |
| |
| /** |
| * Gets the table name. |
| * |
| * @return the table name |
| */ |
| public String getTableName() { |
| return this.tableName; |
| } |
| |
| /** |
| * Gets the database name. |
| * |
| * @return the database name |
| */ |
| public String getDatabaseName() { |
| return this.dbName; |
| } |
| |
| @Override |
| public String toString() { |
| return "HCatAddPartitionDesc [" |
| + (tableName != null ? "tableName=" + tableName + ", " : "tableName=null") |
| + (dbName != null ? "dbName=" + dbName + ", " : "dbName=null") |
| + (location != null ? "location=" + location + ", " : "location=null") |
| + (partSpec != null ? "partSpec=" + partSpec : "partSpec=null") + "]"; |
| } |
| |
| /** |
| * Creates the builder for specifying attributes. |
| * |
| * @param dbName the db name |
| * @param tableName the table name |
| * @param location the location |
| * @param partSpec the part spec |
| * @return the builder |
| * @throws HCatException |
| */ |
| public static Builder create(String dbName, String tableName, String location, |
| Map<String, String> partSpec) throws HCatException { |
| return new Builder(dbName, tableName, location, partSpec); |
| } |
| |
| Partition toHivePartition(Table hiveTable) throws HCatException { |
| Partition hivePtn = new Partition(); |
| hivePtn.setDbName(this.dbName); |
| hivePtn.setTableName(this.tableName); |
| |
| List<String> pvals = new ArrayList<String>(); |
| for (FieldSchema field : hiveTable.getPartitionKeys()) { |
| String val = partSpec.get(field.getName()); |
| if (val == null || val.length() == 0) { |
| throw new HCatException("create partition: Value for key " |
| + field.getName() + " is null or empty"); |
| } |
| pvals.add(val); |
| } |
| |
| hivePtn.setValues(pvals); |
| StorageDescriptor sd = new StorageDescriptor(hiveTable.getSd()); |
| hivePtn.setSd(sd); |
| hivePtn.setParameters(hiveTable.getParameters()); |
| if (this.location != null) { |
| hivePtn.getSd().setLocation(this.location); |
| } else { |
| String partName; |
| try { |
| partName = Warehouse.makePartName( |
| hiveTable.getPartitionKeys(), pvals); |
| LOG.info("Setting partition location to :" + partName); |
| } catch (MetaException e) { |
| throw new HCatException("Exception while creating partition name.", e); |
| } |
| Path partPath = new Path(hiveTable.getSd().getLocation(), partName); |
| hivePtn.getSd().setLocation(partPath.toString()); |
| } |
| hivePtn.setCreateTime((int) (System.currentTimeMillis() / 1000)); |
| hivePtn.setLastAccessTimeIsSet(false); |
| return hivePtn; |
| } |
| |
| public static class Builder { |
| |
| private String tableName; |
| private String location; |
| private Map<String, String> values; |
| private String dbName; |
| |
| private Builder(String dbName, String tableName, String location, Map<String, String> values) { |
| this.dbName = dbName; |
| this.tableName = tableName; |
| this.location = location; |
| this.values = values; |
| } |
| |
| /** |
| * Builds the HCatAddPartitionDesc. |
| * |
| * @return the h cat add partition desc |
| * @throws HCatException |
| */ |
| public HCatAddPartitionDesc build() throws HCatException { |
| if (this.dbName == null) { |
| this.dbName = MetaStoreUtils.DEFAULT_DATABASE_NAME; |
| } |
| HCatAddPartitionDesc desc = new HCatAddPartitionDesc( |
| this.dbName, this.tableName, this.location, |
| this.values); |
| return desc; |
| } |
| } |
| |
| } |