You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@flink.apache.org by "Rong Rong (JIRA)" <ji...@apache.org> on 2018/06/08 16:07:00 UTC

[jira] [Commented] (FLINK-9430) Support Casting of Object to Primitive types for Flink SQL UDF

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

Rong Rong commented on FLINK-9430:
----------------------------------

Hi here, I did some integration test. There are 2 glues that makes the current implementation unable to generate any Kyro serialization for this.
(A). UDF follow immediately by CAST will always get resolved to one RexCall during logical planning phase (multiple Rules can apply here) and thus will not create any serialization problem
(B). when UDF returns an Object, the GenericTypeInfo return type is generally not accepted. 

For now I think the implementation is pretty safe. Any thoughts on this?

> Support Casting of Object to Primitive types for Flink SQL UDF
> --------------------------------------------------------------
>
>                 Key: FLINK-9430
>                 URL: https://issues.apache.org/jira/browse/FLINK-9430
>             Project: Flink
>          Issue Type: New Feature
>          Components: Table API &amp; SQL
>            Reporter: Shuyi Chen
>            Assignee: Shuyi Chen
>            Priority: Major
>
> We want to add a SQL UDF to access specific element in a JSON string using JSON path. However, the JSON element can be of different types, e.g. Int, Float, Double, String, Boolean and etc.. Since return type is not part of the method signature, we can not use overload. So we will end up writing a UDF for each type, e.g. GetFloatFromJSON, GetIntFromJSON and etc., which has a lot of duplication. 
> One way to unify all these UDF functions is to implement one UDF and return java.lang.Object, and in the SQL statement, use CAST AS to cast the returned Object into the correct type. Below is an example:
>  
> {code:java}
> object JsonPathUDF extends ScalarFunction {
>  def eval(jsonStr: String, path: String): Object = {
>    JSONParser.parse(jsonStr).read(path)
>  }
> }{code}
> {code:java}
>  SELECT CAST(jsonpath(json, "$.store.book.title") AS VARCHAR(32)) as bookTitle FROM table1{code}
> The current Flink SQL cast implementation does not support casting from GenericTypeInfo<java.lang.Object> to another type, I have already got a local branch to fix this. Please comment if there are alternatives to the problem above.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)