Author: knoguchi Date: Sat Dec 9 06:37:22 2017 New Revision: 1817591 URL: http://svn.apache.org/viewvc?rev=1817591&view=rev Log: PIG-5201: Null handling on FLATTEN (knoguchi)
Modified: pig/trunk/CHANGES.txt pig/trunk/src/docs/src/documentation/content/xdocs/basic.xml pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/relationalOperators/POForEach.java pig/trunk/src/org/apache/pig/impl/util/TupleFormat.java pig/trunk/src/org/apache/pig/newplan/logical/relational/LOGenerate.java pig/trunk/src/org/apache/pig/newplan/logical/relational/LogToPhyTranslationVisitor.java pig/trunk/test/org/apache/pig/test/TestFlatten.java pig/trunk/test/org/apache/pig/test/TestLineageFindRelVisitor.java pig/trunk/test/org/apache/pig/test/TestProjectRange.java pig/trunk/test/org/apache/pig/test/TestTuple.java pig/trunk/test/org/apache/pig/test/Util.java pig/trunk/test/org/apache/pig/test/data/GoldenFiles/tez/TEZC-MergeCogroup-1.gld pig/trunk/test/org/apache/pig/test/data/GoldenFiles/tez/TEZC-MergeJoin-1.gld Modified: pig/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/pig/trunk/CHANGES.txt?rev=1817591&r1=1817590&r2=1817591&view=diff ============================================================================== --- pig/trunk/CHANGES.txt (original) +++ pig/trunk/CHANGES.txt Sat Dec 9 06:37:22 2017 @@ -60,6 +60,8 @@ OPTIMIZATIONS BUG FIXES +PIG-5201: Null handling on FLATTEN (knoguchi) + PIG-5315: pig.script is not set for scripts run via PigServer (satishsaley via rohini) PIG-5310: MergeJoin throwing NullPointer Exception (satishsaley via rohini) Modified: pig/trunk/src/docs/src/documentation/content/xdocs/basic.xml URL: http://svn.apache.org/viewvc/pig/trunk/src/docs/src/documentation/content/xdocs/basic.xml?rev=1817591&r1=1817590&r2=1817591&view=diff ============================================================================== --- pig/trunk/src/docs/src/documentation/content/xdocs/basic.xml (original) +++ pig/trunk/src/docs/src/documentation/content/xdocs/basic.xml Sat Dec 9 06:37:22 2017 @@ -1225,6 +1225,20 @@ dump X; (joe,18,2.5,joe,18,2.5) </source> </section> + <section id="nulls_flatten"> + <title>Nulls and FLATTEN Operator</title> + <p>The FLATTEN operator handles null value differently based on its schema.</p> + <p>For null tuples, FLATTEN(null) produces multiples nulls based on the number of elements in the schema for that field. + If tuple has no schema, FLATTEN(null) simply returns a single null. </p> + <p>For null bags, we would have liked to discard the row just like we do with flatten of an empty bag. + However, it was too late by the time we noticed this inconsistency. + In order to preserve the backward compatibility, FLATTEN(null) for bag produces multiples nulls + based on the number of elements defined for the schema of this bag. + If no schema, a single null is returned. </p> + <p>For bags containing some null tuples, it follows the same rule as flatten of null tuples described above. </p> + <p>For null maps, FLATTEN(null) produces 2 nulls to represent the key and the value.</p> + <p>For null with other types, FLATTEN(null) simply returns a single null.</p> + </section> </section> @@ -5453,8 +5467,11 @@ D = foreach C generate A::y, z; -- Canno we will see (a,k1,1), (a,k2,2) and (a,k3,3) as the result. </p> + <p>For other types, flatten becomes a no-op and simply returns the passed value. </p> + <p>Also note that the flatten of empty bag will result in that row being discarded; no output is generated. (See also <a href="perf.html#nulls">Drop Nulls Before a Join</a>.) </p> + <p>As for flatten with null values, see <a href="#nulls_flatten">Nulls and FLATTEN operator</a>.</p> <source> grunt> cat empty.bag Modified: pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/relationalOperators/POForEach.java URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/relationalOperators/POForEach.java?rev=1817591&r1=1817590&r2=1817591&view=diff ============================================================================== --- pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/relationalOperators/POForEach.java (original) +++ pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/relationalOperators/POForEach.java Sat Dec 9 06:37:22 2017 @@ -74,6 +74,8 @@ public class POForEach extends PhysicalO // so we can also save on the Boolean.booleanValue() calls protected boolean[] isToBeFlattenedArray; + private int[] flattenNumFields = null; + protected int noItems; //Since the plan has a generate, this needs to be maintained @@ -446,6 +448,8 @@ public class POForEach extends PhysicalO } else if (inputData.result instanceof Map && isToBeFlattenedArray[i]) { its[i] = ((Map)bags[i]).entrySet().iterator(); } else { + // This includes FLATTEN(null) for bag and map + // in addition to non-null values from other data types its[i] = null; } } @@ -490,7 +494,6 @@ public class POForEach extends PhysicalO if(getReporter()!=null) { getReporter().progress(); } - //createTuple(data); res.result = createTuple(data); res.returnStatus = POStatus.STATUS_OK; return res; @@ -538,17 +541,23 @@ public class POForEach extends PhysicalO for(int i = 0; i < data.length; ++i) { Object in = data[i]; - if(isToBeFlattenedArray[i] && in instanceof Tuple) { + if(!isToBeFlattenedArray[i]) { + if (knownSize) { + out.set(idx++, in); + } else { + out.append(in); + } + } else if(in instanceof Tuple) { Tuple t = (Tuple)in; int size = t.size(); for(int j = 0; j < size; ++j) { if (knownSize) { out.set(idx++, t.get(j)); } else { - out.append(t.get(j)); - } + out.append(t.get(j)); + } } - } else if (isToBeFlattenedArray[i] && in instanceof Map.Entry) { + } else if (in instanceof Map.Entry) { Map.Entry entry = (Map.Entry)in; if (knownSize) { out.set(idx++, entry.getKey()); @@ -557,14 +566,25 @@ public class POForEach extends PhysicalO out.append(entry.getKey()); out.append(entry.getValue()); } + } else if (in == null && + flattenNumFields != null && flattenNumFields[i] != 0 ) { + // Handling of FLATTEN(null) here. + // Expanding to multiple nulls depending on the schema + for( int j = 0; j < flattenNumFields[i]; j++ ) { + if (knownSize) { + out.set(idx++, null); + } else { + out.append(null); + } + } } else { if (knownSize) { out.set(idx++, in); - } else { - out.append(in); + } else { + out.append(in); + } } } - } if (inpTuple != null) { return illustratorMarkup(inpTuple, out, 0); } else { @@ -706,6 +726,7 @@ public class POForEach extends PhysicalO clone.addOriginalLocation(alias, getOriginalLocations()); clone.endOfAllInputProcessing = endOfAllInputProcessing; clone.mapSideOnly = mapSideOnly; + clone.flattenNumFields = flattenNumFields; return clone; } @@ -714,6 +735,10 @@ public class POForEach extends PhysicalO return processingPlan; } + public void setFlattenNumFields (int [] flattenNumFields) { + this.flattenNumFields = flattenNumFields; + } + protected void setUpFlattens(List<Boolean> isToBeFlattened) { if(isToBeFlattened == null) { isToBeFlattenedArray = null; Modified: pig/trunk/src/org/apache/pig/impl/util/TupleFormat.java URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/impl/util/TupleFormat.java?rev=1817591&r1=1817590&r2=1817591&view=diff ============================================================================== --- pig/trunk/src/org/apache/pig/impl/util/TupleFormat.java (original) +++ pig/trunk/src/org/apache/pig/impl/util/TupleFormat.java Sat Dec 9 06:37:22 2017 @@ -47,32 +47,34 @@ public class TupleFormat { public static String format(Tuple tuple) { StringBuilder sb = new StringBuilder(); sb.append('('); - for (int i = 0; i < tuple.size(); ++i) { - try { - Object d = tuple.get(i); - if (d != null) { - if (d instanceof Map) { - sb.append(DataType.mapToString((Map<String, Object>) d)); - } else if (d instanceof Tuple) { - Tuple t = (Tuple) d; - sb.append(TupleFormat.format(t)); - } else if (d instanceof DataBag){ - DataBag bag=(DataBag)d; - sb.append(BagFormat.format(bag)); + if( tuple != null ) { + for (int i = 0; i < tuple.size(); ++i) { + try { + Object d = tuple.get(i); + if (d != null) { + if (d instanceof Map) { + sb.append(DataType.mapToString((Map<String, Object>) d)); + } else if (d instanceof Tuple) { + Tuple t = (Tuple) d; + sb.append(TupleFormat.format(t)); + } else if (d instanceof DataBag){ + DataBag bag=(DataBag)d; + sb.append(BagFormat.format(bag)); + } + else { + sb.append(d.toString()); + } + } else { + sb.append(""); } - else { - sb.append(d.toString()); - } - } else { - sb.append(""); + if (i != tuple.size() - 1) + sb.append(","); + } catch (ExecException e) { + e.printStackTrace(); + mLog.warn("Exception when format tuple", e); } - if (i != tuple.size() - 1) - sb.append(","); - } catch (ExecException e) { - e.printStackTrace(); - mLog.warn("Exception when format tuple", e); - } + } } sb.append(')'); return sb.toString(); Modified: pig/trunk/src/org/apache/pig/newplan/logical/relational/LOGenerate.java URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/newplan/logical/relational/LOGenerate.java?rev=1817591&r1=1817590&r2=1817591&view=diff ============================================================================== --- pig/trunk/src/org/apache/pig/newplan/logical/relational/LOGenerate.java (original) +++ pig/trunk/src/org/apache/pig/newplan/logical/relational/LOGenerate.java Sat Dec 9 06:37:22 2017 @@ -33,6 +33,7 @@ import org.apache.pig.newplan.logical.re public class LOGenerate extends LogicalRelationalOperator { private List<LogicalExpressionPlan> outputPlans; private boolean[] flattenFlags; + private int[] flattenNumFields; // mUserDefinedSchema is the original input from the user, we don't suppose // to store uid in mUserDefinedSchema private List<LogicalSchema> mUserDefinedSchema = null; @@ -74,7 +75,9 @@ public class LOGenerate extends LogicalR outputPlanSchemas = new ArrayList<LogicalSchema>(); expSchemas = new ArrayList<LogicalSchema>(); + flattenNumFields = new int[outputPlans.size()]; for(int i=0; i<outputPlans.size(); i++) { + flattenNumFields[i] = 0; LogicalExpression exp = (LogicalExpression)outputPlans.get(i).getSources().get(0); LogicalSchema mUserDefinedSchemaCopy = null; @@ -111,8 +114,10 @@ public class LOGenerate extends LogicalR if (fieldSchema.type == DataType.BAG) { // if it is bag, get the schema of tuples if (fieldSchema.schema!=null) { - if (fieldSchema.schema.getField(0).schema!=null) + if (fieldSchema.schema.getField(0).schema!=null) { innerFieldSchemas = fieldSchema.schema.getField(0).schema.getFields(); + flattenNumFields[i] = innerFieldSchemas.size(); + } for (LogicalSchema.LogicalFieldSchema fs : innerFieldSchemas) { fs.alias = fs.alias == null ? null : fieldSchema.alias + "::" + fs.alias; } @@ -120,6 +125,7 @@ public class LOGenerate extends LogicalR } else if (fieldSchema.type == DataType.MAP) { //should only contain 1 schemafield for Map's value innerFieldSchemas = fieldSchema.schema.getFields(); + flattenNumFields[i] = 2; // used for FLATTEN(null-map) LogicalSchema.LogicalFieldSchema fsForValue = innerFieldSchemas.get(0); fsForValue.alias = fieldSchema.alias + "::value"; @@ -129,6 +135,7 @@ public class LOGenerate extends LogicalR expSchema.addField(fsForKey); } else { // DataType.TUPLE innerFieldSchemas = fieldSchema.schema.getFields(); + flattenNumFields[i] = innerFieldSchemas.size(); for (LogicalSchema.LogicalFieldSchema fs : innerFieldSchemas) { fs.alias = fs.alias == null ? null : fieldSchema.alias + "::" + fs.alias; } @@ -213,6 +220,10 @@ public class LOGenerate extends LogicalR public boolean[] getFlattenFlags() { return flattenFlags; } + + public int [] getFlattenNumFields() { + return flattenNumFields; + } public void setFlattenFlags(boolean[] flatten) { flattenFlags = flatten; Modified: pig/trunk/src/org/apache/pig/newplan/logical/relational/LogToPhyTranslationVisitor.java URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/newplan/logical/relational/LogToPhyTranslationVisitor.java?rev=1817591&r1=1817590&r2=1817591&view=diff ============================================================================== --- pig/trunk/src/org/apache/pig/newplan/logical/relational/LogToPhyTranslationVisitor.java (original) +++ pig/trunk/src/org/apache/pig/newplan/logical/relational/LogToPhyTranslationVisitor.java Sat Dec 9 06:37:22 2017 @@ -877,6 +877,7 @@ public class LogToPhyTranslationVisitor } POForEach poFE = new POForEach(new OperatorKey(scope, nodeGen .getNextNodeId(scope)), foreach.getRequestedParallelism(), innerPlans, flattenList, schema); + poFE.setFlattenNumFields(gen.getFlattenNumFields()); poFE.addOriginalLocation(foreach.getAlias(), foreach.getLocation()); poFE.setResultType(DataType.BAG); logToPhyMap.put(foreach, poFE); Modified: pig/trunk/test/org/apache/pig/test/TestFlatten.java URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/TestFlatten.java?rev=1817591&r1=1817590&r2=1817591&view=diff ============================================================================== --- pig/trunk/test/org/apache/pig/test/TestFlatten.java (original) +++ pig/trunk/test/org/apache/pig/test/TestFlatten.java Sat Dec 9 06:37:22 2017 @@ -97,4 +97,270 @@ public class TestFlatten { "('a', 'b', '1', '2')", "('a', 'b', '3', '4')", "('c', 'd', '1', '2')", "('c', 'd', '3', '4')" }); Util.checkQueryOutputsAfterSort(actualResults.iterator(), expectedResults); } + + @Test + public void testFlattenOnNullBag() throws Exception { + Storage.Data data = Storage.resetData(pig); + data.set("input", + Storage.tuple( + Storage.bag( + Storage.tuple("a","b"), + Storage.tuple("c","d")), + Storage.bag( + Storage.tuple("1","2"), + Storage.tuple("3","4")) + ), + Storage.tuple( + null, + Storage.bag( + Storage.tuple("11","12"), + Storage.tuple("13","14")) + ), + Storage.tuple( + Storage.bag( + Storage.tuple("k","l"), + Storage.tuple("m","n")), + null + ), + Storage.tuple( + Storage.bag( + null, + Storage.tuple("e","f")), + Storage.bag( + Storage.tuple("5","6"), + Storage.tuple("7","8")) + ), + Storage.tuple( + Storage.bag( + Storage.tuple("g","h"), + Storage.tuple("i","j")), + Storage.bag( + Storage.tuple("9","10"), + null + ) + ) + ); + + pig.setBatchOn(); + pig.registerQuery("A = load 'input' using mock.Storage() as (bag1:bag {(a1_1:int, a1_2:chararray)}, bag2:bag{(a2_1:chararray, a2_2:chararray)});"); + pig.registerQuery("B = foreach A GENERATE FLATTEN(bag1), FLATTEN(bag2);"); + pig.registerQuery("store B into 'output' using mock.Storage();"); + List<ExecJob> execJobs = pig.executeBatch(); + for( ExecJob execJob : execJobs ) { + assertTrue(execJob.getStatus() == ExecJob.JOB_STATUS.COMPLETED ); + } + List<Tuple> actualResults = data.get("output"); + List<Tuple> expectedResults = Util.getTuplesFromConstantTupleStrings( + new String[] { + "('a', 'b', '1', '2')", "('a', 'b', '3', '4')", "('c', 'd', '1', '2')", "('c', 'd', '3', '4')", + + //flatten(null-bag) on schema {(a1_1:int, a1_2:chararray)} expands to (null, null) + "(null, null, '11', '12')", "(null, null, '13', '14')", + "('k', 'l', null, null)", "('m', 'n', null, null)", + + //flatten(null-tuple-from-bag) on schema {(a1_1:int, a1_2:chararray)} also expands to (null, null) + "(null, null, '5', '6')", "(null, null, '7', '8')", "('e', 'f', '5', '6')", "('e', 'f', '7', '8')", + "('g', 'h', '9', '10')", "('g', 'h', null, null)", "('i', 'j', '9', '10')", "('i', 'j', null, null)" }); + + Util.checkQueryOutputs(actualResults.iterator(), expectedResults); + } + + @Test + public void testFlattenOnNullMap() throws Exception { + Storage.Data data = Storage.resetData(pig); + data.set("input", + Storage.tuple( + Storage.map("a","b", + "c","d"), + Storage.map("1","2", + "3","4") + ) + , + Storage.tuple( + null, + Storage.map("11","12", + "13","14") + ), + Storage.tuple( + Storage.map("k","l", + "m","n"), + null + ) + ); + pig.setBatchOn(); + pig.registerQuery("A = load 'input' using mock.Storage() as (map1:map [chararray], map2:map [chararray]);"); + pig.registerQuery("B = foreach A GENERATE FLATTEN(map1), FLATTEN(map2);"); + pig.registerQuery("store B into 'output' using mock.Storage();"); + List<ExecJob> execJobs = pig.executeBatch(); + for( ExecJob execJob : execJobs ) { + assertTrue(execJob.getStatus() == ExecJob.JOB_STATUS.COMPLETED ); + } + List<Tuple> actualResults = data.get("output"); + List<Tuple> expectedResults = Util.getTuplesFromConstantTupleStrings( + new String[] { + "('a', 'b', '1', '2')", "('a', 'b', '3', '4')", "('c', 'd', '1', '2')", "('c', 'd', '3', '4')", + // flatten(null-map) should expand to (null, null) + "(null, null, '11', '12')", "(null, null, '13', '14')", "('k', 'l', null, null)", "('m', 'n', null, null)" + }); + Util.checkQueryOutputsAfterSort(actualResults.iterator(), expectedResults); + } + + @Test + public void testFlattenOnNullTuple() throws Exception { + Storage.Data data = Storage.resetData(pig); + data.set("input", + Storage.tuple( + Storage.tuple("a","b"), + Storage.tuple("1","2") + ), + Storage.tuple( + null, + Storage.tuple("3","4") + ), + Storage.tuple( + Storage.tuple("c","d"), + null + ), + Storage.tuple( + Storage.tuple("e", null), + Storage.tuple(null,"5") + ) + ); + pig.setBatchOn(); + pig.registerQuery("A = load 'input' using mock.Storage() as (tuple1:tuple (a1:chararray, a2:chararray), tuple2:tuple (a3:chararray, a4:chararray));"); + pig.registerQuery("B = foreach A GENERATE FLATTEN(tuple1), FLATTEN(tuple2);"); + pig.registerQuery("store B into 'output' using mock.Storage();"); + List<ExecJob> execJobs = pig.executeBatch(); + for( ExecJob execJob : execJobs ) { + assertTrue(execJob.getStatus() == ExecJob.JOB_STATUS.COMPLETED ); + } + List<Tuple> actualResults = data.get("output"); + List<Tuple> expectedResults = Util.getTuplesFromConstantTupleStrings( + new String[] { + "('a', 'b', '1', '2')", "(null, null, '3', '4')", "('c', 'd', null, null)", "('e', null, null, '5')" }); + + Util.checkQueryOutputs(actualResults.iterator(), expectedResults); + } + + @Test + public void testFlattenOnNullWithNoSchema() throws Exception { + Storage.Data data = Storage.resetData(pig); + data.set("input", + Storage.tuple( + null, + Storage.bag( + Storage.tuple("1","2"), + Storage.tuple("3","4")) + ), + + Storage.tuple( + Storage.bag( + null, + Storage.tuple("e","f")), + Storage.bag( + Storage.tuple("5","6"), + Storage.tuple("7","8")) + ), + + Storage.tuple( + null, + Storage.map("9","10") + ), + + Storage.tuple( + Storage.tuple("g","h"), + null + ), + + Storage.tuple( + Storage.tuple("13", null), + Storage.tuple(null,"16") + ) + ); + pig.setBatchOn(); + pig.registerQuery("A = load 'input' using mock.Storage() as (a1, a2);"); + pig.registerQuery("B = foreach A GENERATE FLATTEN(a1), FLATTEN(a2);"); + pig.registerQuery("store B into 'output' using mock.Storage();"); + List<ExecJob> execJobs = pig.executeBatch(); + for( ExecJob execJob : execJobs ) { + assertTrue(execJob.getStatus() == ExecJob.JOB_STATUS.COMPLETED ); + } + List<Tuple> actualResults = data.get("output"); + List<Tuple> expectedResults = Util.getTuplesFromConstantTupleStrings( + new String[] { + "(null, '1', '2')", "(null, '3', '4')", //since no schema, flatten(null) ==> one null + "(null, '5', '6')", "(null, '7', '8')", "('e', 'f', '5', '6')", "('e', 'f', '7', '8')", + "(null, '9', '10')", + "('g', 'h', null)", + "('13', null, null, '16')"}); + + Util.checkQueryOutputs(actualResults.iterator(), expectedResults); + } + + @Test + public void testFlattenOnNullBagWithColumnPrune() throws Exception { + Storage.Data data = Storage.resetData(pig); + data.set("input", + Storage.tuple( + 1, + Storage.bag( + Storage.tuple("a","b"), + Storage.tuple("c","d")), + Storage.bag( + Storage.tuple("1","2"), + Storage.tuple("3","4")) + ), + Storage.tuple( + 2, + null, + Storage.bag( + Storage.tuple("11","12"), + Storage.tuple("13","14")) + ), + Storage.tuple( + 3, + Storage.bag( + Storage.tuple("k","l"), + Storage.tuple("m","n")), + null + ), + Storage.tuple( + 4, + Storage.bag( + null, + Storage.tuple("e","f")), + Storage.bag( + Storage.tuple("5","6"), + Storage.tuple("7","8")) + ), + Storage.tuple( + 5, + Storage.bag( + Storage.tuple("g","h"), + Storage.tuple("i","j")), + Storage.bag( + Storage.tuple("9","10"), + null + ) + ) + ); + pig.setBatchOn(); + pig.registerQuery("A = load 'input' using mock.Storage() as (a0:int, bag1:bag {(a1_1:int, a1_2:chararray)}, bag2:bag{(a2_1:chararray, a2_2:chararray)});"); + pig.registerQuery("B = foreach A GENERATE FLATTEN(bag1), FLATTEN(bag2);"); + pig.registerQuery("store B into 'output' using mock.Storage();"); + List<ExecJob> execJobs = pig.executeBatch(); + for( ExecJob execJob : execJobs ) { + assertTrue(execJob.getStatus() == ExecJob.JOB_STATUS.COMPLETED ); + } + List<Tuple> actualResults = data.get("output"); + List<Tuple> expectedResults = Util.getTuplesFromConstantTupleStrings( + new String[] { + "('a', 'b', '1', '2')", "('a', 'b', '3', '4')", "('c', 'd', '1', '2')", "('c', 'd', '3', '4')", + "(null, null, '11', '12')", "(null, null, '13', '14')", + "('k', 'l', null, null)", "('m', 'n', null, null)", + "(null, null, '5', '6')", "(null, null, '7', '8')", "('e', 'f', '5', '6')", "('e', 'f', '7', '8')", + "('g', 'h', '9', '10')", "('g', 'h', null, null)", "('i', 'j', '9', '10')", "('i', 'j', null, null)" }); + + Util.checkQueryOutputs(actualResults.iterator(), expectedResults); + } } Modified: pig/trunk/test/org/apache/pig/test/TestLineageFindRelVisitor.java URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/TestLineageFindRelVisitor.java?rev=1817591&r1=1817590&r2=1817591&view=diff ============================================================================== --- pig/trunk/test/org/apache/pig/test/TestLineageFindRelVisitor.java (original) +++ pig/trunk/test/org/apache/pig/test/TestLineageFindRelVisitor.java Sat Dec 9 06:37:22 2017 @@ -181,7 +181,7 @@ public class TestLineageFindRelVisitor { pig.executeBatch(); List<Tuple> actualResults = data.get("output"); - List<Tuple> expectedResults = Util.getTuplesFromConstantTupleStrings( + List<Tuple> expectedResults = Util.getTuplesFromConstantTupleStringAsByteArray( new String[] {"('aaa', 'bbb')"}); Util.checkQueryOutputs(actualResults.iterator(), expectedResults); } Modified: pig/trunk/test/org/apache/pig/test/TestProjectRange.java URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/TestProjectRange.java?rev=1817591&r1=1817590&r2=1817591&view=diff ============================================================================== --- pig/trunk/test/org/apache/pig/test/TestProjectRange.java (original) +++ pig/trunk/test/org/apache/pig/test/TestProjectRange.java Sat Dec 9 06:37:22 2017 @@ -554,8 +554,8 @@ public class TestProjectRange { List<Tuple> expectedRes = Util.getTuplesFromConstantTupleStrings( new String[] { - "(10,20,30,40,50)", - "(11,21,31,41,51)", + "(10,20L,30,40,50)", + "(11,21L,31,41,51)", }); Util.checkQueryOutputs(it, expectedRes); } @@ -799,8 +799,8 @@ public class TestProjectRange { List<Tuple> expectedRes = Util.getTuplesFromConstantTupleStrings( new String[] { - "(10,20,30,40,50)", - "(11,21,31,41,51)", + "(10,20L,30,40,50)", + "(11,21L,31,41,51)", }); Util.checkQueryOutputs(it, expectedRes); } @@ -828,10 +828,10 @@ public class TestProjectRange { Iterator<Tuple> it = pigServer.openIterator("o"); List<Tuple> expectedRes = - Util.getTuplesFromConstantTupleStrings( + Util.getTuplesFromConstantTupleStringAsByteArray( new String[] { - "(11,21,31,41,51)", - "(10,20,30,40,50)", + "('11','21','31','41','51')", + "('10','20','30','40','50')", }); Util.checkQueryOutputs(it, expectedRes); } @@ -858,10 +858,10 @@ public class TestProjectRange { Iterator<Tuple> it = pigServer.openIterator("o"); List<Tuple> expectedRes = - Util.getTuplesFromConstantTupleStrings( + Util.getTuplesFromConstantTupleStringAsByteArray( new String[] { - "(11,21,31,41,51)", - "(10,20,30,40,50)", + "('11','21','31','41','51')", + "('10','20','30','40','50')", }); Util.checkQueryOutputs(it, expectedRes); } Modified: pig/trunk/test/org/apache/pig/test/TestTuple.java URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/TestTuple.java?rev=1817591&r1=1817590&r2=1817591&view=diff ============================================================================== --- pig/trunk/test/org/apache/pig/test/TestTuple.java (original) +++ pig/trunk/test/org/apache/pig/test/TestTuple.java Sat Dec 9 06:37:22 2017 @@ -70,6 +70,9 @@ public class TestTuple { assertEquals( "(12,[pig#scalability],,12,1.2,(innerTuple),{(innerTuple)})", TupleFormat.format(tuple)); + + //check if TupleFormat can handle null tuple + assertEquals("()", TupleFormat.format(null)); } catch (ExecException e) { e.printStackTrace(); fail(); Modified: pig/trunk/test/org/apache/pig/test/Util.java URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/Util.java?rev=1817591&r1=1817590&r2=1817591&view=diff ============================================================================== --- pig/trunk/test/org/apache/pig/test/Util.java (original) +++ pig/trunk/test/org/apache/pig/test/Util.java Sat Dec 9 06:37:22 2017 @@ -535,16 +535,10 @@ public class Util { * @param actualResults Result of the executed Pig query * @param expectedResults Expected results List to validate against */ - static public void checkQueryOutputs(Iterator<Tuple> actualResults, + static public void checkQueryOutputs(Iterator<Tuple> actualResults, List<Tuple> expectedResults) { - int count = 0; - for (Tuple expected : expectedResults) { - Tuple actual = actualResults.next(); - count++; - Assert.assertEquals(expected.toString(), actual.toString()); - } - Assert.assertEquals(expectedResults.size(), count); - } + checkQueryOutputs(actualResults, expectedResults.iterator(), null ); + } /** * Helper function to check if the result of a Pig Query is in line with @@ -560,7 +554,15 @@ public class Util { Tuple expected = expectedResults.next(); Assert.assertTrue("Actual result has less records than expected results", actualResults.hasNext()); Tuple actual = actualResults.next(); - Assert.assertEquals(expected.toString(), actual.toString()); + + // If this tuple contains any bags, bags will be sorted before comparisons + if( !expected.equals(actual) ) { + // Using string comparisons since error message is more readable + // (only showing the part which differs) + Assert.assertEquals(expected.toString(), actual.toString()); + // if above goes through, simply failing with object comparisons + Assert.assertEquals(expected, actual); + } count++; } Assert.assertFalse("Actual result has more records than expected results", actualResults.hasNext()); @@ -613,9 +615,7 @@ public class Util { Collections.sort(actualResList); Collections.sort(expectedResList); - Assert.assertEquals("Comparing actual and expected results. ", - expectedResList, actualResList); - + checkQueryOutputs(actualResList.iterator(), expectedResList); } /** Modified: pig/trunk/test/org/apache/pig/test/data/GoldenFiles/tez/TEZC-MergeCogroup-1.gld URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/data/GoldenFiles/tez/TEZC-MergeCogroup-1.gld?rev=1817591&r1=1817590&r2=1817591&view=diff ============================================================================== --- pig/trunk/test/org/apache/pig/test/data/GoldenFiles/tez/TEZC-MergeCogroup-1.gld (original) +++ pig/trunk/test/org/apache/pig/test/data/GoldenFiles/tez/TEZC-MergeCogroup-1.gld Sat Dec 9 06:37:22 2017 @@ -14,7 +14,7 @@ Local Rearrange[tuple]{tuple}(false) - s | | | Project[tuple][*] - scope-33 | -|---a: Load(file:///tmp/input1:org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MergeJoinIndexer('org.apache.pig.test.TestMapSideCogroup$DummyCollectableLoader','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','a_1-0','scope','false')) - scope-31 +|---a: Load(file:///tmp/input1:org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MergeJoinIndexer('org.apache.pig.test.TestMapSideCogroup$DummyCollectableLoader','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','a_1-0','scope','false')) - scope-31 Tez vertex scope-32 # Plan on vertex POValueOutputTez - scope-38 -> [scope-22] @@ -40,4 +40,4 @@ c: Store(file:///tmp/pigoutput:org.apach | | | |---Project[bytearray][1] - scope-4 | - |---a: Load(file:///tmp/input1:org.apache.pig.test.TestMapSideCogroup$DummyCollectableLoader) - scope-0 \ No newline at end of file + |---a: Load(file:///tmp/input1:org.apache.pig.test.TestMapSideCogroup$DummyCollectableLoader) - scope-0 Modified: pig/trunk/test/org/apache/pig/test/data/GoldenFiles/tez/TEZC-MergeJoin-1.gld URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/data/GoldenFiles/tez/TEZC-MergeJoin-1.gld?rev=1817591&r1=1817590&r2=1817591&view=diff ============================================================================== --- pig/trunk/test/org/apache/pig/test/data/GoldenFiles/tez/TEZC-MergeJoin-1.gld (original) +++ pig/trunk/test/org/apache/pig/test/data/GoldenFiles/tez/TEZC-MergeJoin-1.gld Sat Dec 9 06:37:22 2017 @@ -14,7 +14,7 @@ Local Rearrange[tuple]{tuple}(false) - s | | | Project[tuple][*] - scope-38 | -|---b: Load(file:///tmp/input2:org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MergeJoinIndexer('org.apache.pig.builtin.PigStorage','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','b_1-1','scope','true')) - scope-8 +|---b: Load(file:///tmp/input2:org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MergeJoinIndexer('org.apache.pig.builtin.PigStorage','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','b_1-1','scope','true')) - scope-8 Tez vertex scope-37 # Plan on vertex POValueOutputTez - scope-43 -> [scope-29] @@ -48,4 +48,4 @@ d: Store(file:///tmp/pigoutput:org.apach | | | |---Project[bytearray][1] - scope-4 | - |---a: Load(file:///tmp/input1:org.apache.pig.builtin.PigStorage) - scope-0 \ No newline at end of file + |---a: Load(file:///tmp/input1:org.apache.pig.builtin.PigStorage) - scope-0