[ 
https://issues.apache.org/jira/browse/FLINK-6355?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Kaibo Zhou updated FLINK-6355:
------------------------------
    Description: 
Currently {{TableEnvironment}} only supports register ScalarFunction, the Java 
users cannot use {{TableEnvironment}} to register {{TableFunction}}.

This is the test code:

{code:title=TableFunc0.java|borderStyle=solid}
public class TableFunc0 extends TableFunction<String> {
        public void eval(String str) {
           for (String s : str.split(" ")) {
             collect(s);
           }
        }
}
{code}

{code:title=WordCountExample.java|borderStyle=solid}
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.table.api.java.StreamTableEnvironment;
import org.apache.flink.table.api.TableEnvironment;
import org.apache.flink.table.api.Types;
import org.apache.flink.table.sinks.CsvTableSink;
import org.apache.flink.table.sources.CsvTableSource;
import org.apache.flink.table.sources.TableSource;
import org.apache.flink.types.Row;

public class WordCountExample {

    public void build(TableEnvironment tableEnv, java.util.Properties 
properties) {
        TableSource<Row> tableSource = new CsvTableSource("/path/to/csv/", new 
String[]{"a", "b"}, new TypeInformation[]{Types.STRING(), Types.STRING()});
        tableEnv.registerTableSource("csv_source", tableSource);

        TableFunc0 tableFunc0 = new TableFunc0();

        //  expected
        tableEnv.registerFunction("func0", tableFunc0); // will compile error 
here

        // not expected
        ((StreamTableEnvironment) tableEnv).registerFunction("func0", 
tableFunc0); // also can work, but not what we wanted

        tableEnv.scan("csv_source")
                .select("a, b")
                .join("func0(a) as c")
                .select("b, c")
                .writeToSink(new CsvTableSink("/path/to/result", ","));
    }
}
{code}

There will be compilation errors in tableEnv.registerFunction: "Found 
xx.xxx.TableFunc0,required org.apache.flink.table.functions.ScalarFunction"。

I did some testing, only Java users have this problem.

----

Why the user interface only has {{TableEnvironment}}, but not 
{{StreamTableEnvironment}} or {{BatchStreamTableEnvironment}} ? 

We want to eliminate most of the differences between the batch and the stream 
execution environment, and support the use of the {{TableEnvironment}} to write 
programs only. So that users only need to write a code, and can use the command 
parameters to determine run in the batch or stream processing environment.This 
is also the advantage of flink which can unify batch and stream processing.
 


  was:
Currently {{TableEnvironment}} only supports register ScalarFunction, the Java 
users cannot use {{TableEnvironment}} to register {{TableFunction}}.

This is the test code:

TableFunc0.java

{quote}
public class TableFunc0 extends TableFunction<String> {
        public void eval(String str) {
           for (String s : str.split(" ")) {
             collect(s);
           }
        }
}
{quote}

WordCountExample.java

{quote}
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.table.api.java.StreamTableEnvironment;
import org.apache.flink.table.api.TableEnvironment;
import org.apache.flink.table.api.Types;
import org.apache.flink.table.sinks.CsvTableSink;
import org.apache.flink.table.sources.CsvTableSource;
import org.apache.flink.table.sources.TableSource;
import org.apache.flink.types.Row;

public class WordCountExample {

    public void build(TableEnvironment tableEnv, java.util.Properties 
properties) {
        TableSource<Row> tableSource = new CsvTableSource("/path/to/csv/", new 
String[]{"a", "b"}, new TypeInformation[]{Types.STRING(), Types.STRING()});
        tableEnv.registerTableSource("csv_source", tableSource);

        TableFunc0 tableFunc0 = new TableFunc0();

        tableEnv.registerFunction("func0", tableFunc0); // compile error here

        ((StreamTableEnvironment) tableEnv).registerFunction("func0", 
tableFunc0); // also can work, but not what we want

        tableEnv.scan("csv_source")
                .select("a, b")
                .join("func0(a) as c")
                .select("b, c")
                .writeToSink(new CsvTableSink("/path/to/result", ","));
    }
}
{quote}

There will be compilation errors in tableEnv.registerFunction: "Found 
xx.xxx.TableFunc0,required org.apache.flink.table.functions.ScalarFunction"。

I did some testing, only Java users have this problem.



> TableEnvironment support register TableFunction
> -----------------------------------------------
>
>                 Key: FLINK-6355
>                 URL: https://issues.apache.org/jira/browse/FLINK-6355
>             Project: Flink
>          Issue Type: Improvement
>          Components: Table API & SQL
>            Reporter: Kaibo Zhou
>            Assignee: Kaibo Zhou
>
> Currently {{TableEnvironment}} only supports register ScalarFunction, the 
> Java users cannot use {{TableEnvironment}} to register {{TableFunction}}.
> This is the test code:
> {code:title=TableFunc0.java|borderStyle=solid}
> public class TableFunc0 extends TableFunction<String> {
>       public void eval(String str) {
>            for (String s : str.split(" ")) {
>              collect(s);
>            }
>         }
> }
> {code}
> {code:title=WordCountExample.java|borderStyle=solid}
> import org.apache.flink.api.common.typeinfo.TypeInformation;
> import org.apache.flink.table.api.java.StreamTableEnvironment;
> import org.apache.flink.table.api.TableEnvironment;
> import org.apache.flink.table.api.Types;
> import org.apache.flink.table.sinks.CsvTableSink;
> import org.apache.flink.table.sources.CsvTableSource;
> import org.apache.flink.table.sources.TableSource;
> import org.apache.flink.types.Row;
> public class WordCountExample {
>     public void build(TableEnvironment tableEnv, java.util.Properties 
> properties) {
>         TableSource<Row> tableSource = new CsvTableSource("/path/to/csv/", 
> new String[]{"a", "b"}, new TypeInformation[]{Types.STRING(), 
> Types.STRING()});
>         tableEnv.registerTableSource("csv_source", tableSource);
>         TableFunc0 tableFunc0 = new TableFunc0();
>         //  expected
>         tableEnv.registerFunction("func0", tableFunc0); // will compile error 
> here
>         // not expected
>         ((StreamTableEnvironment) tableEnv).registerFunction("func0", 
> tableFunc0); // also can work, but not what we wanted
>         tableEnv.scan("csv_source")
>                 .select("a, b")
>                 .join("func0(a) as c")
>                 .select("b, c")
>                 .writeToSink(new CsvTableSink("/path/to/result", ","));
>     }
> }
> {code}
> There will be compilation errors in tableEnv.registerFunction: "Found 
> xx.xxx.TableFunc0,required org.apache.flink.table.functions.ScalarFunction"。
> I did some testing, only Java users have this problem.
> ----
> Why the user interface only has {{TableEnvironment}}, but not 
> {{StreamTableEnvironment}} or {{BatchStreamTableEnvironment}} ? 
> We want to eliminate most of the differences between the batch and the stream 
> execution environment, and support the use of the {{TableEnvironment}} to 
> write programs only. So that users only need to write a code, and can use the 
> command parameters to determine run in the batch or stream processing 
> environment.This is also the advantage of flink which can unify batch and 
> stream processing.
>  



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to