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

sridhar Reddy edited comment on BEAM-7724 at 7/31/19 8:08 PM:
--------------------------------------------------------------

[~amaliujia] I tested this issue a little bit and found out that the problem 
may lie in the order of methods and it is possible that currently only one UDF 
works/accepted(I need to debug further) and only the first method gets 
accepted. It seems to work fine with null as input.

Ex:

public static class SFunction implements BeamSqlUdf {

public static int eval (Double a)

{ if (a==null) return 444; else return 14; }

public static int eval (Integer a)

{ if (a==null)) return 444; else return a*2; }

}

Schema type =
 
Schema.builder().addInt32Field("c1").addStringField("c2").addNullableField("c3",
 Schema.FieldType.DOUBLE).build();

the following works fine even when c3 is null
----
PCollection<Row> outputStream =
 inputTable.apply(SqlTransform.query("select c1, c2, eval(c3) from PCOLLECTION 
where c1 = 81 ")
 .registerUdf("eval",SFunction.class));

------

The following doesn't work unless eval(Integer a) method comes first.

------------

PCollection<Row> outputStream =
 inputTable.apply(SqlTransform.query("select eval(c1), c2, c3 from PCOLLECTION 
where c1 = 81 ")
 .registerUdf("eval",SFunction.class));
----
Let me know your thoughts.

 

 


was (Author: sridharg):
[~amaliujia] I tested this issue a little bit and found out that the problem 
may lie in the order of methods and it is possible that currently only one UDF 
works/accepted(I need to debug further) and only the first method gets 
accepted. It seems to work fine with null as input.

Ex:

public static class SFunction implements BeamSqlUdf {

public static int eval (Double a) {
 if (a==null)
 return 444;
 else
 return 14;
}

public static int eval (Integer a) {
 if (a.equals(null))
 return 444;
 else
 return a*2;
}




}

Schema type =
 
Schema.builder().addInt32Field("c1").addStringField("c2").addNullableField("c3",
 Schema.FieldType.DOUBLE).build();

the following works fine even when c3 is null

----

PCollection<Row> outputStream =
 inputTable.apply(SqlTransform.query("select c1, c2, eval(c3) from PCOLLECTION 
where c1 = 81 ")
 .registerUdf("eval",SFunction.class));

------

The following doesn't work unless eval(Integer a) method comes first.

------------

PCollection<Row> outputStream =
inputTable.apply(SqlTransform.query("select eval(c1), c2, c3 from PCOLLECTION 
where c1 = 81 ")
.registerUdf("eval",SFunction.class));

-----

Let me know your thoughts.

 

 

> Codegen should cast(null) to a type to match exact function signature
> ---------------------------------------------------------------------
>
>                 Key: BEAM-7724
>                 URL: https://issues.apache.org/jira/browse/BEAM-7724
>             Project: Beam
>          Issue Type: Improvement
>          Components: dsl-sql
>            Reporter: Rui Wang
>            Assignee: sridhar Reddy
>            Priority: Major
>
> If there are two function signatures for the same function name, when input 
> parameter is null, Janino will throw exception due to vagueness:
> A(String)
> A(Integer)
> Janino does not know how to match A(null).  



--
This message was sent by Atlassian JIRA
(v7.6.14#76016)

Reply via email to