You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@pig.apache.org by "Cheolsoo Park (JIRA)" <ji...@apache.org> on 2013/02/25 08:26:16 UTC

[jira] [Comment Edited] (PIG-3153) TestScriptUDF.testJavascriptExampleScript fails in trunk

    [ https://issues.apache.org/jira/browse/PIG-3153?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13585680#comment-13585680 ] 

Cheolsoo Park edited comment on PIG-3153 at 2/25/13 7:25 AM:
-------------------------------------------------------------

[~dreambird], I looked into this and am attaching a patch (PIG-3153-2.patch.txt) that allows outputSchema to be a tuple. Here is my reasoning:

1. The reason why defining outputSchema as "t:(word:chararray,num:long)" causes a NPE is because the JavaScript object doesn't have a field called "t". If you read "JsFunction.jsToPigTuple()", it recursively searches for every field of outputSchema in the JavaScript object.

IMO, the right way to fix this is to wrap the JavaScript object with another object and name that wrapper object as "t". 

2. Regarding my change to JsFunction, I removed "outputSchema.size() == 1" in addition to adding "outputSchema.getField(0).type == DataType.TUPLE" to the if condition.

The former is redundant because the size of outputSchema is always equal to 1 now due to PIG-3082. The latter is added to wrap the JavaScript object into another object as explained above.

With this patch, the test code doesn't have to be modified at all. Please let me know what you think. Thanks!
                
      was (Author: cheolsoo):
    [~dreambird], I looked into this and am attaching a patch (PIG-3135-2.patch.txt) that allows outputSchema to be a tuple. Here is my reasoning:

1. The reason why defining outputSchema as "t:(word:chararray,num:long)" causes a NPE is because the JavaScript object doesn't have a field called "t". If you read "JsFunction.jsToPigTuple()", it recursively searches for every field of outputSchema in the JavaScript object.

IMO, the right way to fix this is to wrap the JavaScript object with another object and name that wrapper object as "t". 

2. Regarding my change to JsFunction, I removed "outputSchema.size() == 1" in addition to adding "outputSchema.getField(0).type == DataType.TUPLE" to the if condition.

The former is redundant because the size of outputSchema is always equal to 1 now due to PIG-3082. The latter is added to wrap the JavaScript object into another object as explained above.

With this patch, the test code doesn't have to be modified at all. Please let me know what you think. Thanks!
                  
> TestScriptUDF.testJavascriptExampleScript fails in trunk
> --------------------------------------------------------
>
>                 Key: PIG-3153
>                 URL: https://issues.apache.org/jira/browse/PIG-3153
>             Project: Pig
>          Issue Type: Bug
>    Affects Versions: 0.12
>            Reporter: Cheolsoo Park
>            Assignee: Johnny Zhang
>             Fix For: 0.12
>
>         Attachments: PIG-3153-2.patch.txt, PIG-3153.patch.txt, PIG-3153.patch.txt
>
>
> To reproduce the failure, do:
> {code}
> ant clean test -Dtestcase=TestScriptUDF
> {code}
> The test fails with the following error:
> {code}
> Caused by: org.apache.pig.impl.logicalLayer.FrontendException: ERROR 0: Given UDF returns an improper Schema. Schema should only contain one field of a Tuple, Bag, or a single type. Returns: {word: chararray,num: long}
>     at org.apache.pig.newplan.logical.expression.UserFuncExpression.getFieldSchema(UserFuncExpression.java:206)
>     at org.apache.pig.newplan.logical.optimizer.FieldSchemaResetter.execute(SchemaResetter.java:264)
>     at org.apache.pig.newplan.logical.expression.AllSameExpressionVisitor.visit(AllSameExpressionVisitor.java:143)
>     at org.apache.pig.newplan.logical.expression.UserFuncExpression.accept(UserFuncExpression.java:88)
>     at org.apache.pig.newplan.ReverseDependencyOrderWalker.walk(ReverseDependencyOrderWalker.java:70)
>     at org.apache.pig.newplan.PlanVisitor.visit(PlanVisitor.java:52)
>     at org.apache.pig.newplan.logical.optimizer.SchemaResetter.visitAll(SchemaResetter.java:67)
>     at org.apache.pig.newplan.logical.optimizer.SchemaResetter.visit(SchemaResetter.java:122)
>     at org.apache.pig.newplan.logical.relational.LOGenerate.accept(LOGenerate.java:240)
>     at org.apache.pig.newplan.DependencyOrderWalker.walk(DependencyOrderWalker.java:75)
>     at org.apache.pig.newplan.logical.optimizer.SchemaResetter.visit(SchemaResetter.java:114)
>     at org.apache.pig.newplan.logical.relational.LOForEach.accept(LOForEach.java:76)
>     at org.apache.pig.newplan.DependencyOrderWalker.walk(DependencyOrderWalker.java:75)
>     at org.apache.pig.newplan.PlanVisitor.visit(PlanVisitor.java:52)
>     at org.apache.pig.parser.LogicalPlanBuilder.expandAndResetVisitor(LogicalPlanBuilder.java:402)
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira