/** * 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.hadoop.hive.ql.plan; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; /** * Map Join operator Descriptor implementation. * */ @Explain(displayName = "HashTable Sink Operator") public class HashTableSinkDesc extends JoinDesc implements Serializable { private static final long serialVersionUID = 1L; // used to handle skew join private boolean handleSkewJoin = false; private int skewKeyDefinition = -1; private Map<Byte, String> bigKeysDirMap; private Map<Byte, Map<Byte, String>> smallKeysDirMap; private Map<Byte, TableDesc> skewKeysValuesTables; // alias to key mapping private Map<Byte, List<ExprNodeDesc>> exprs; // alias to filter mapping private Map<Byte, List<ExprNodeDesc>> filters; // used for create joinOutputObjectInspector protected List<String> outputColumnNames; // key:column output name, value:tag private transient Map<String, Byte> reversedExprs; // No outer join involved protected boolean noOuterJoin; protected JoinCondDesc[] conds; protected Byte[] tagOrder; private TableDesc keyTableDesc; private Map<Byte, List<ExprNodeDesc>> keys; private TableDesc keyTblDesc; private List<TableDesc> valueTblDescs; private List<TableDesc> valueTblFilteredDescs; private int posBigTable; private Map<Byte, List<Integer>> retainList; private transient String bigTableAlias; private LinkedHashMap<String, LinkedHashMap<String, ArrayList<String>>> aliasBucketFileNameMapping; private LinkedHashMap<String, Integer> bucketFileNameMapping; private float hashtableMemoryUsage; //map join dump file name private String dumpFilePrefix; public HashTableSinkDesc() { bucketFileNameMapping = new LinkedHashMap<String, Integer>(); } public HashTableSinkDesc(MapJoinDesc clone) { this.bigKeysDirMap = clone.getBigKeysDirMap(); this.conds = clone.getConds(); this.exprs= clone.getExprs(); this.handleSkewJoin = clone.getHandleSkewJoin(); this.keyTableDesc = clone.getKeyTableDesc(); this.noOuterJoin = clone.getNoOuterJoin(); this.outputColumnNames = clone.getOutputColumnNames(); this.reversedExprs = clone.getReversedExprs(); this.skewKeyDefinition = clone.getSkewKeyDefinition(); this.skewKeysValuesTables = clone.getSkewKeysValuesTables(); this.smallKeysDirMap = clone.getSmallKeysDirMap(); this.tagOrder = clone.getTagOrder(); this.filters = clone.getFilters(); this.keys = clone.getKeys(); this.keyTblDesc = clone.getKeyTblDesc(); this.valueTblDescs = clone.getValueTblDescs(); this.valueTblFilteredDescs = clone.getValueFilteredTblDescs(); this.posBigTable = clone.getPosBigTable(); this.retainList = clone.getRetainList(); this.bigTableAlias = clone.getBigTableAlias(); this.aliasBucketFileNameMapping = clone.getAliasBucketFileNameMapping(); this.bucketFileNameMapping = clone.getBucketFileNameMapping(); this.dumpFilePrefix = clone.getDumpFilePrefix(); } private void initRetainExprList() { retainList = new HashMap<Byte, List<Integer>>(); Set<Entry<Byte, List<ExprNodeDesc>>> set = exprs.entrySet(); Iterator<Entry<Byte, List<ExprNodeDesc>>> setIter = set.iterator(); while (setIter.hasNext()) { Entry<Byte, List<ExprNodeDesc>> current = setIter.next(); List<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < current.getValue().size(); i++) { list.add(i); } retainList.put(current.getKey(), list); } } public float getHashtableMemoryUsage() { return hashtableMemoryUsage; } public void setHashtableMemoryUsage(float hashtableMemoryUsage) { this.hashtableMemoryUsage = hashtableMemoryUsage; } /** * @return the dumpFilePrefix */ public String getDumpFilePrefix() { return dumpFilePrefix; } /** * @param dumpFilePrefix * the dumpFilePrefix to set */ public void setDumpFilePrefix(String dumpFilePrefix) { this.dumpFilePrefix = dumpFilePrefix; } public boolean isHandleSkewJoin() { return handleSkewJoin; } @Override public void setHandleSkewJoin(boolean handleSkewJoin) { this.handleSkewJoin = handleSkewJoin; } @Override public int getSkewKeyDefinition() { return skewKeyDefinition; } @Override public void setSkewKeyDefinition(int skewKeyDefinition) { this.skewKeyDefinition = skewKeyDefinition; } @Override public Map<Byte, String> getBigKeysDirMap() { return bigKeysDirMap; } @Override public void setBigKeysDirMap(Map<Byte, String> bigKeysDirMap) { this.bigKeysDirMap = bigKeysDirMap; } @Override public Map<Byte, Map<Byte, String>> getSmallKeysDirMap() { return smallKeysDirMap; } @Override public void setSmallKeysDirMap(Map<Byte, Map<Byte, String>> smallKeysDirMap) { this.smallKeysDirMap = smallKeysDirMap; } @Override public Map<Byte, TableDesc> getSkewKeysValuesTables() { return skewKeysValuesTables; } @Override public void setSkewKeysValuesTables(Map<Byte, TableDesc> skewKeysValuesTables) { this.skewKeysValuesTables = skewKeysValuesTables; } @Override public Map<Byte, List<ExprNodeDesc>> getExprs() { return exprs; } @Override public void setExprs(Map<Byte, List<ExprNodeDesc>> exprs) { this.exprs = exprs; } @Override public Map<Byte, List<ExprNodeDesc>> getFilters() { return filters; } public List<TableDesc> getValueTblFilteredDescs() { return valueTblFilteredDescs; } public void setValueTblFilteredDescs(List<TableDesc> valueTblFilteredDescs) { this.valueTblFilteredDescs = valueTblFilteredDescs; } @Override public void setFilters(Map<Byte, List<ExprNodeDesc>> filters) { this.filters = filters; } @Override public List<String> getOutputColumnNames() { return outputColumnNames; } @Override public void setOutputColumnNames(List<String> outputColumnNames) { this.outputColumnNames = outputColumnNames; } @Override public Map<String, Byte> getReversedExprs() { return reversedExprs; } @Override public void setReversedExprs(Map<String, Byte> reversedExprs) { this.reversedExprs = reversedExprs; } @Override public boolean isNoOuterJoin() { return noOuterJoin; } @Override public void setNoOuterJoin(boolean noOuterJoin) { this.noOuterJoin = noOuterJoin; } @Override public JoinCondDesc[] getConds() { return conds; } @Override public void setConds(JoinCondDesc[] conds) { this.conds = conds; } @Override public Byte[] getTagOrder() { return tagOrder; } @Override public void setTagOrder(Byte[] tagOrder) { this.tagOrder = tagOrder; } @Override public TableDesc getKeyTableDesc() { return keyTableDesc; } @Override public void setKeyTableDesc(TableDesc keyTableDesc) { this.keyTableDesc = keyTableDesc; } public Map<Byte, List<Integer>> getRetainList() { return retainList; } public void setRetainList(Map<Byte, List<Integer>> retainList) { this.retainList = retainList; } /** * @return the keys */ @Explain(displayName = "keys") public Map<Byte, List<ExprNodeDesc>> getKeys() { return keys; } /** * @param keys * the keys to set */ public void setKeys(Map<Byte, List<ExprNodeDesc>> keys) { this.keys = keys; } /** * @return the position of the big table not in memory */ @Explain(displayName = "Position of Big Table") public int getPosBigTable() { return posBigTable; } /** * @param posBigTable * the position of the big table not in memory */ public void setPosBigTable(int posBigTable) { this.posBigTable = posBigTable; } /** * @return the keyTblDesc */ public TableDesc getKeyTblDesc() { return keyTblDesc; } /** * @param keyTblDesc * the keyTblDesc to set */ public void setKeyTblDesc(TableDesc keyTblDesc) { this.keyTblDesc = keyTblDesc; } /** * @return the valueTblDescs */ public List<TableDesc> getValueTblDescs() { return valueTblDescs; } /** * @param valueTblDescs * the valueTblDescs to set */ public void setValueTblDescs(List<TableDesc> valueTblDescs) { this.valueTblDescs = valueTblDescs; } /** * @return bigTableAlias */ public String getBigTableAlias() { return bigTableAlias; } /** * @param bigTableAlias */ public void setBigTableAlias(String bigTableAlias) { this.bigTableAlias = bigTableAlias; } public LinkedHashMap<String, LinkedHashMap<String, ArrayList<String>>> getAliasBucketFileNameMapping() { return aliasBucketFileNameMapping; } public void setAliasBucketFileNameMapping( LinkedHashMap<String, LinkedHashMap<String, ArrayList<String>>> aliasBucketFileNameMapping) { this.aliasBucketFileNameMapping = aliasBucketFileNameMapping; } public LinkedHashMap<String, Integer> getBucketFileNameMapping() { return bucketFileNameMapping; } public void setBucketFileNameMapping(LinkedHashMap<String, Integer> bucketFileNameMapping) { this.bucketFileNameMapping = bucketFileNameMapping; } }