You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ha...@apache.org on 2013/08/27 18:48:30 UTC
svn commit: r1517877 -
/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/HashTableSinkOperator.java
Author: hashutosh
Date: Tue Aug 27 16:48:30 2013
New Revision: 1517877
URL: http://svn.apache.org/r1517877
Log:
HIVE-5144 : HashTableSink allocates empty new Object[] arrays & OOMs - use a static emptyRow instead (Gopal V via Ashutosh Chauhan)
Modified:
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/HashTableSinkOperator.java
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/HashTableSinkOperator.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/HashTableSinkOperator.java?rev=1517877&r1=1517876&r2=1517877&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/HashTableSinkOperator.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/HashTableSinkOperator.java Tue Aug 27 16:48:30 2013
@@ -92,6 +92,12 @@ public class HashTableSinkOperator exten
private transient MapJoinTableContainer[] mapJoinTables;
private transient MapJoinTableContainerSerDe[] mapJoinTableSerdes;
+
+ private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
+ private static final MapJoinRowContainer EMPTY_ROW_CONTAINER = new MapJoinRowContainer();
+ static {
+ EMPTY_ROW_CONTAINER.add(EMPTY_OBJECT_ARRAY);
+ }
private transient boolean noOuterJoin;
@@ -223,19 +229,30 @@ public class HashTableSinkOperator exten
// compute keys and values as StandardObjects
MapJoinKey key = JoinUtil.computeMapJoinKeys(null, row, joinKeys[alias],
joinKeysObjectInspectors[alias]);
- Object[] value = JoinUtil.computeMapJoinValues(row, joinValues[alias],
+ Object[] value = EMPTY_OBJECT_ARRAY;
+ if((hasFilter(alias) && filterMaps[alias].length > 0) || joinValues[alias].size() > 0) {
+ value = JoinUtil.computeMapJoinValues(row, joinValues[alias],
joinValuesObjectInspectors[alias], joinFilters[alias], joinFilterObjectInspectors[alias],
filterMaps == null ? null : filterMaps[alias]);
+ }
MapJoinTableContainer tableContainer = mapJoinTables[alias];
MapJoinRowContainer rowContainer = tableContainer.get(key);
if (rowContainer == null) {
- rowContainer = new MapJoinRowContainer();
- rowContainer.add(value);
+ if(value.length != 0) {
+ rowContainer = new MapJoinRowContainer();
+ rowContainer.add(value);
+ } else {
+ rowContainer = EMPTY_ROW_CONTAINER;
+ }
rowNumber++;
if (rowNumber > hashTableScale && rowNumber % hashTableScale == 0) {
memoryExhaustionHandler.checkMemoryStatus(tableContainer.size(), rowNumber);
}
tableContainer.put(key, rowContainer);
+ } else if (rowContainer == EMPTY_ROW_CONTAINER) {
+ rowContainer = rowContainer.copy();
+ rowContainer.add(value);
+ tableContainer.put(key, rowContainer);
} else {
rowContainer.add(value);
}