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

DOAN DuyHai edited comment on SPARK-9435 at 11/12/15 1:58 PM:
--------------------------------------------------------------

Work-around: *define the UDF using the Scala API instead*

{code:java}
    public static final class ComputeDecadeFn extends 
AbstractFunction1<Integer,String> implements Serializable {
        @Override
        public String apply(Integer year) {
            return computeDecade(year);
        }
    }
      sqlContext.udf().register("computeDecade", new ComputeDecadeFn(),
                JavaApiHelper.getTypeTag(String.class),
                JavaApiHelper.getTypeTag(Integer.class));
{code}

 You cannot use the lambda expression because the UDF function should be 
serializable.

 The _JavaApiHelper.getTypeTag()_ method  comes from 
*com.datastax.spark.connector.util.JavaApiHelper* here: 
https://github.com/datastax/spark-cassandra-connector/blob/master/spark-cassandra-connector/src/main/scala/com/datastax/spark/connector/util/JavaApiHelper.scala#L35


was (Author: doanduyhai):
Work-around: *define the UDF using the Scala API instead*

{code:java}
    public static final class ComputeDecadeFn extends 
AbstractFunction1<Integer,String> implements Serializable {
        @Override
        public String apply(Integer year) {
            return computeDecade(year);
        }
    }
      sqlContext.udf().register("computeDecade", new ComputeDecadeFn(),
                JavaApiHelper.getTypeTag(String.class),
                JavaApiHelper.getTypeTag(Integer.class));
{code}

 You cannot use the lambda expression because the UDF function should be 
serializable.


> Java UDFs don't work with GROUP BY expressions
> ----------------------------------------------
>
>                 Key: SPARK-9435
>                 URL: https://issues.apache.org/jira/browse/SPARK-9435
>             Project: Spark
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 1.4.1
>         Environment: All
>            Reporter: James Aley
>         Attachments: IncMain.java, points.txt
>
>
> If you define a UDF in Java, for example by implementing the UDF1 interface, 
> then try to use that UDF on a column in both the SELECT and GROUP BY clauses 
> of a query, you'll get an error like this:
> {code}
> "SELECT inc(y),COUNT(DISTINCT x) FROM test_table GROUP BY inc(y)"
> org.apache.spark.sql.AnalysisException: expression 'y' is neither present in 
> the group by, nor is it an aggregate function. Add to group by or wrap in 
> first() if you don't care which value you get.
> {code}
> We put together a minimal reproduction in the attached Java file, which makes 
> use of the data in the text file attached.
> I'm guessing there's some kind of issue with the equality implementation, so 
> Spark can't tell that those two expressions are the same maybe? If you do the 
> same thing from Scala, it works fine.
> Note for context: we ran into this issue while working around SPARK-9338.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@spark.apache.org
For additional commands, e-mail: issues-h...@spark.apache.org

Reply via email to