You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@flink.apache.org by "Shuyi Chen (JIRA)" <ji...@apache.org> on 2018/05/24 06:28:00 UTC

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

Shuyi Chen created FLINK-9430:
---------------------------------

             Summary: 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


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}

I have already got a local branch working. Please comment if there are alternatives.



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