Hi everyone, +1 for this proposal, I believe it is very useful to the minimum, It would be great even having "ML_PREDICT" and "ML_EVALUATE" as built-in PTFs in this FLIP as discussed. IIUC this will be included in the 1.20 roadmap? Best Regards Ahmed Hamdy
On Fri, 22 Mar 2024 at 23:54, Hao Li <h...@confluent.io.invalid> wrote: > Hi Timo and Jark, > > I agree Oracle's syntax seems concise and more descriptive. For the > built-in `ML_PREDICT` and `ML_EVALUATE` functions I agree with Jark we can > support them as built-in PTF using `SqlTableFunction` for this FLIP. We can > have a different FLIP discussing user defined PTF and adopt that later for > model functions later. To summarize, the current proposed syntax is > > SELECT f1, f2, label FROM TABLE(ML_PREDICT(TABLE `my_data`, > `classifier_model`, f1, f2)) > > SELECT * FROM TABLE(ML_EVALUATE(TABLE `eval_data`, `classifier_model`, f1, > f2)) > > Is `DESCRIPTOR` a must in the syntax? If so, it becomes > > SELECT f1, f2, label FROM TABLE(ML_PREDICT(TABLE `my_data`, > `classifier_model`, DESCRIPTOR(f1), DESCRIPTOR(f2))) > > SELECT * FROM TABLE(ML_EVALUATE(TABLE `eval_data`, `classifier_model`, > DESCRIPTOR(f1), DESCRIPTOR(f2))) > > If Calcite supports dropping outer table keyword, it becomes > > SELECT f1, f2, label FROM ML_PREDICT(TABLE `my_data`, `classifier_model`, > DESCRIPTOR(f1), DESCRIPTOR(f2)) > > SELECT * FROM ML_EVALUATE(TABLE `eval_data`, `classifier_model`, > DESCRIPTOR( > f1), DESCRIPTOR(f2)) > > Thanks, > Hao > > > > On Fri, Mar 22, 2024 at 9:16 AM Jark Wu <imj...@gmail.com> wrote: > > > Sorry, I mean we can bump the Calcite version if needed in Flink 1.20. > > > > On Fri, 22 Mar 2024 at 22:19, Jark Wu <imj...@gmail.com> wrote: > > > > > Hi Timo, > > > > > > Introducing user-defined PTF is very useful in Flink, I'm +1 for this. > > > But I think the ML model FLIP is not blocked by this, because we > > > can introduce ML_PREDICT and ML_EVALUATE as built-in PTFs > > > just like TUMBLE/HOP. And support user-defined ML functions as > > > a future FLIP. > > > > > > Regarding the simplified PTF syntax which reduces the outer TABLE() > > > keyword, > > > it seems it was just supported[1] by the Calcite community last month > and > > > will be > > > released in the next version (v1.37). The Calcite community is > preparing > > > the > > > 1.37 release, so we can bump the version if needed in Flink 1.19. > > > > > > Best, > > > Jark > > > > > > [1]: https://issues.apache.org/jira/browse/CALCITE-6254 > > > > > > On Fri, 22 Mar 2024 at 21:46, Timo Walther <twal...@apache.org> wrote: > > > > > >> Hi everyone, > > >> > > >> this is a very important change to the Flink SQL syntax but we can't > > >> wait until the SQL standard is ready for this. So I'm +1 on > introducing > > >> the MODEL concept as a first class citizen in Flink. > > >> > > >> For your information: Over the past months I have already spent a > > >> significant amount of time thinking about how we can introduce PTFs in > > >> Flink. I reserved FLIP-440[1] for this purpose and I will share a > > >> version of this in the next 1-2 weeks. > > >> > > >> For a good implementation of FLIP-440 and also FLIP-437, we should > > >> evolve the PTF syntax in collaboration with Apache Calcite. > > >> > > >> There are different syntax versions out there: > > >> > > >> 1) Flink > > >> > > >> SELECT * FROM > > >> TABLE(TUMBLE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '10' > MINUTES)); > > >> > > >> 2) SQL standard > > >> > > >> SELECT * FROM > > >> TABLE(TUMBLE(TABLE(Bid), DESCRIPTOR(bidtime), INTERVAL '10' > > MINUTES)); > > >> > > >> 3) Oracle > > >> > > >> SELECT * FROM > > >> TUMBLE(Bid, COLUMNS(bidtime), INTERVAL '10' MINUTES)); > > >> > > >> As you can see above, Flink does not follow the standard correctly as > it > > >> would need to use `TABLE()` but this is not provided by Calcite yet. > > >> > > >> I really like the Oracle syntax[2][3] a lot. It reduces necessary > > >> keywords to a minimum. Personally, I would like to discuss this syntax > > >> in a separate FLIP and hope I will find supporters for: > > >> > > >> > > >> SELECT * FROM > > >> TUMBLE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '10' MINUTES); > > >> > > >> If we go entirely with the Oracle syntax, as you can see in the > example, > > >> Oracle allows for passing identifiers directly. This would solve our > > >> problems for the MODEL as well: > > >> > > >> SELECT f1, f2, label FROM ML_PREDICT( > > >> data => `my_data`, > > >> model => `classifier_model`, > > >> input => DESCRIPTOR(f1, f2)); > > >> > > >> Or we completely adopt the Oracle syntax: > > >> > > >> SELECT f1, f2, label FROM ML_PREDICT( > > >> data => `my_data`, > > >> model => `classifier_model`, > > >> input => COLUMNS(f1, f2)); > > >> > > >> > > >> What do you think? > > >> > > >> Happy to create a FLIP for just this syntax question and collaborate > > >> with the Calcite community on this. Supporting the syntax of Oracle > > >> shouldn't be too hard to convince at least as parser parameter. > > >> > > >> Regards, > > >> Timo > > >> > > >> [1] > > >> > > >> > > > https://cwiki.apache.org/confluence/display/FLINK/%5BWIP%5D+FLIP-440%3A+User-defined+Polymorphic+Table+Functions > > >> [2] > > >> > > >> > > > https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_TF.html#GUID-0F66E239-DE77-4C0E-AC76-D5B632AB8072 > > >> [3] > > https://oracle-base.com/articles/18c/polymorphic-table-functions-18c > > >> > > >> > > >> > > >> On 20.03.24 17:22, Mingge Deng wrote: > > >> > Thanks Jark for all the insightful comments. > > >> > > > >> > We have updated the proposal per our offline discussions: > > >> > 1. Model will be treated as a new relation in FlinkSQL. > > >> > 2. Include the common ML predict and evaluate functions into the > open > > >> > source flink to complete the user journey. > > >> > And we should be able to extend the calcite SqlTableFunction to > > >> support > > >> > these two ML functions. > > >> > > > >> > Best, > > >> > Mingge > > >> > > > >> > On Mon, Mar 18, 2024 at 7:05 PM Jark Wu <imj...@gmail.com> wrote: > > >> > > > >> >> Hi Hao, > > >> >> > > >> >>> I meant how the table name > > >> >> in window TVF gets translated to `SqlCallingBinding`. Probably we > > need > > >> to > > >> >> fetch the table definition from the catalog somewhere. Do we treat > > >> those > > >> >> window TVF specially in parser/planner so that catalog is looked up > > >> when > > >> >> they are seen? > > >> >> > > >> >> The table names are resolved and validated by Calcite SqlValidator. > > We > > >> >> don' need to fetch from catalog manually. > > >> >> The specific checking logic of cumulate window happens in > > >> >> SqlCumulateTableFunction.OperandMetadataImpl#checkOperandTypes. > > >> >> The return type of SqlCumulateTableFunction is defined in > > >> >> #getRowTypeInference() method. > > >> >> Both are public interfaces provided by Calcite and it seems it's > not > > >> >> specially handled in parser/planner. > > >> >> > > >> >> I didn't try that, but my gut feeling is that the framework is > ready > > to > > >> >> extend a customized TVF. > > >> >> > > >> >>> For what model is, I'm wondering if it has to be datatype or > > relation. > > >> >> Can > > >> >> it be another kind of citizen parallel to > > >> datatype/relation/function/db? > > >> >> Redshift also supports `show models` operation, so it seems it's > > >> treated > > >> >> specially as well? > > >> >> > > >> >> If it is an entity only used in catalog scope (e.g., show xxx, > create > > >> xxx, > > >> >> drop xxx), it is fine to introduce it. > > >> >> We have introduced such one before, called Module: "load module", > > "show > > >> >> modules" [1]. > > >> >> But if we want to use Model in TVF parameters, it means it has to > be > > a > > >> >> relation or datatype, because > > >> >> that is what it only accepts now. > > >> >> > > >> >> Thanks for sharing the reason of preferring TVF instead of Redshift > > >> way. It > > >> >> sounds reasonable to me. > > >> >> > > >> >> Best, > > >> >> Jark > > >> >> > > >> >> [1]: > > >> >> > > >> >> > > >> > > > https://nightlies.apache.org/flink/flink-docs-master/docs/dev/table/modules/ > > >> >> > > >> >> On Fri, 15 Mar 2024 at 13:41, Hao Li <h...@confluent.io.invalid> > > wrote: > > >> >> > > >> >>> Hi Jark, > > >> >>> > > >> >>> Thanks for the pointer. Sorry for the confusion: I meant how the > > table > > >> >> name > > >> >>> in window TVF gets translated to `SqlCallingBinding`. Probably we > > >> need to > > >> >>> fetch the table definition from the catalog somewhere. Do we treat > > >> those > > >> >>> window TVF specially in parser/planner so that catalog is looked > up > > >> when > > >> >>> they are seen? > > >> >>> > > >> >>> For what model is, I'm wondering if it has to be datatype or > > relation. > > >> >> Can > > >> >>> it be another kind of citizen parallel to > > >> datatype/relation/function/db? > > >> >>> Redshift also supports `show models` operation, so it seems it's > > >> treated > > >> >>> specially as well? The reasons I don't like Redshift's syntax are: > > >> >>> 1. It's a bit verbose, you need to think of a model name as well > as > > a > > >> >>> function name and the function name also needs to be unique. > > >> >>> 2. More importantly, prediction function isn't the only function > > that > > >> can > > >> >>> operate on models. There could be a set of inference functions [1] > > and > > >> >>> evaluation functions [2] which can operate on models. It's hard to > > >> >> specify > > >> >>> all of them in model creation. > > >> >>> > > >> >>> [1]: > > >> >>> > > >> >>> > > >> >> > > >> > > > https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-predict > > >> >>> [2]: > > >> >>> > > >> >>> > > >> >> > > >> > > > https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-evaluate > > >> >>> > > >> >>> Thanks, > > >> >>> Hao > > >> >>> > > >> >>> On Thu, Mar 14, 2024 at 8:18 PM Jark Wu <imj...@gmail.com> wrote: > > >> >>> > > >> >>>> Hi Hao, > > >> >>>> > > >> >>>>> Can you send me some pointers > > >> >>>> where the function gets the table information? > > >> >>>> > > >> >>>> Here is the code of cumulate window type checking [1]. > > >> >>>> > > >> >>>>> Also is it possible to support <query_stmt> in > > >> >>>> window functions in addiction to table? > > >> >>>> > > >> >>>> Yes. It is not allowed in TVF. > > >> >>>> > > >> >>>> Thanks for the syntax links of other systems. The reason I prefer > > the > > >> >>>> Redshift way is > > >> >>>> that it avoids introducing Model as a relation or datatype > > >> (referenced > > >> >>> as a > > >> >>>> parameter in TVF). > > >> >>>> Model is not a relation because it can be queried directly (e.g., > > >> >> SELECT > > >> >>> * > > >> >>>> FROM model). > > >> >>>> I'm also confused about making Model as a datatype, because I > don't > > >> >> know > > >> >>>> what class the > > >> >>>> model parameter of the eval method of > TableFunction/ScalarFunction > > >> >> should > > >> >>>> be. By defining > > >> >>>> the function with the model, users can directly invoke the > function > > >> >>> without > > >> >>>> reference to the model name. > > >> >>>> > > >> >>>> Best, > > >> >>>> Jark > > >> >>>> > > >> >>>> [1]: > > >> >>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > https://github.com/apache/flink/blob/d6c7eee8243b4fe3e593698f250643534dc79cb5/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/sql/SqlCumulateTableFunction.java#L53 > > >> >>>> > > >> >>>> On Fri, 15 Mar 2024 at 02:48, Hao Li <h...@confluent.io.invalid> > > >> wrote: > > >> >>>> > > >> >>>>> Hi Jark, > > >> >>>>> > > >> >>>>> Thanks for the pointers. It's very helpful. > > >> >>>>> > > >> >>>>> 1. Looks like `tumble`, `hopping` are keywords in calcite > parser. > > >> And > > >> >>> the > > >> >>>>> syntax `cumulate(Table my_table, ...)` needs to get table > > >> information > > >> >>>> from > > >> >>>>> catalog somewhere for type validation etc. Can you send me some > > >> >>> pointers > > >> >>>>> where the function gets the table information? > > >> >>>>> 2. The ideal syntax for model function I think would be > > >> >>> `ML_PREDICT(MODEL > > >> >>>>> <model_name>, {table <table_name> | (query_stmt) })`. I think > with > > >> >>>> special > > >> >>>>> handling of the `ML_PREDICT` function in parser/planner, maybe > we > > >> can > > >> >>> do > > >> >>>>> this like window functions. But to support `MODEL` keyword, we > > need > > >> >>>> calcite > > >> >>>>> parser change I guess. Also is it possible to support > <query_stmt> > > >> in > > >> >>>>> window functions in addiction to table? > > >> >>>>> > > >> >>>>> For the redshift syntax, I'm not sure the purpose of defining > the > > >> >>>> function > > >> >>>>> name with the model. Is it to define the function input/output > > >> >> schema? > > >> >>> We > > >> >>>>> have the schema in our create model syntax and the `ML_PREDICT` > > can > > >> >>>> handle > > >> >>>>> it by getting model definition. I think our syntax is more > concise > > >> to > > >> >>>> have > > >> >>>>> a generic prediction function. I also did some research and it's > > the > > >> >>>> syntax > > >> >>>>> used by Databricks `ai_query` [1], Snowflake `predict` [2], > > Azureml > > >> >>>>> `predict` [3]. > > >> >>>>> > > >> >>>>> [1]: > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > https://docs.databricks.com/en/sql/language-manual/functions/ai_query.html > > >> >>>>> [2]: > > >> >>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > https://github.com/Snowflake-Labs/sfguide-intro-to-machine-learning-with-snowpark-ml-for-python/blob/main/3_snowpark_ml_model_training_inference.ipynb?_fsi=sksXUwQ0 > > >> >>>>> [3]: > > >> >>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > https://learn.microsoft.com/en-us/sql/machine-learning/tutorials/quickstart-python-train-score-model?view=azuresqldb-mi-current > > >> >>>>> > > >> >>>>> Thanks, > > >> >>>>> Hao > > >> >>>>> > > >> >>>>> On Wed, Mar 13, 2024 at 8:57 PM Jark Wu <imj...@gmail.com> > wrote: > > >> >>>>> > > >> >>>>>> Hi Mingge, Hao, > > >> >>>>>> > > >> >>>>>> Thanks for your replies. > > >> >>>>>> > > >> >>>>>>> PTF is actually the ideal approach for model functions, and we > > do > > >> >>>> have > > >> >>>>>> the plans to use PTF for > > >> >>>>>> all model functions (including prediction, evaluation etc..) > once > > >> >> the > > >> >>>> PTF > > >> >>>>>> is supported in FlinkSQL > > >> >>>>>> confluent extension. > > >> >>>>>> > > >> >>>>>> It sounds that PTF is the ideal way and table function is a > > >> >> temporary > > >> >>>>>> solution which will be dropped in the future. > > >> >>>>>> I'm not sure whether we can implement it using PTF in Flink > SQL. > > >> >> But > > >> >>> we > > >> >>>>>> have implemented window > > >> >>>>>> functions using PTF[1]. And introduced a new window function > > >> >> (called > > >> >>>>>> CUMULATE[2]) in Flink SQL based > > >> >>>>>> on this. I think it might work to use PTF and implement model > > >> >>> function > > >> >>>>>> syntax like this: > > >> >>>>>> > > >> >>>>>> SELECT * FROM TABLE(ML_PREDICT( > > >> >>>>>> TABLE my_table, > > >> >>>>>> my_model, > > >> >>>>>> col1, > > >> >>>>>> col2 > > >> >>>>>> )); > > >> >>>>>> > > >> >>>>>> Besides, did you consider following the way of AWS Redshift > which > > >> >>>> defines > > >> >>>>>> model function with the model itself together? > > >> >>>>>> IIUC, a model is a black-box which defines input parameters and > > >> >>> output > > >> >>>>>> parameters which can be modeled into functions. > > >> >>>>>> > > >> >>>>>> > > >> >>>>>> Best, > > >> >>>>>> Jark > > >> >>>>>> > > >> >>>>>> [1]: > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > https://nightlies.apache.org/flink/flink-docs-master/docs/dev/table/sql/queries/window-tvf/#session > > >> >>>>>> [2]: > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > https://cwiki.apache.org/confluence/display/FLINK/FLIP-145%3A+Support+SQL+windowing+table-valued+function#FLIP145:SupportSQLwindowingtablevaluedfunction-CumulatingWindows > > >> >>>>>> [3]: > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > https://github.com/aws-samples/amazon-redshift-ml-getting-started/blob/main/use-cases/bring-your-own-model-remote-inference/README.md#create-model > > >> >>>>>> > > >> >>>>>> > > >> >>>>>> > > >> >>>>>> > > >> >>>>>> On Wed, 13 Mar 2024 at 15:00, Hao Li <h...@confluent.io.invalid > > > > >> >>> wrote: > > >> >>>>>> > > >> >>>>>>> Hi Jark, > > >> >>>>>>> > > >> >>>>>>> Thanks for your questions. These are good questions! > > >> >>>>>>> > > >> >>>>>>> 1. The polymorphism table function I was referring to takes a > > >> >> table > > >> >>>> as > > >> >>>>>>> input and outputs a table. So the syntax would be like > > >> >>>>>>> ``` > > >> >>>>>>> SELECT * FROM ML_PREDICT('model', (SELECT * FROM my_table)) > > >> >>>>>>> ``` > > >> >>>>>>> As far as I know, this is not supported yet on Flink. So > before > > >> >>> it's > > >> >>>>>>> supported, one option for the predict function is using table > > >> >>>> function > > >> >>>>>>> which can output multiple columns > > >> >>>>>>> ``` > > >> >>>>>>> SELECT * FROM my_table, LATERAL VIEW (ML_PREDICT('model', > col1, > > >> >>>> col2)) > > >> >>>>>>> ``` > > >> >>>>>>> > > >> >>>>>>> 2. Good question. Type inference is hard for the `ML_PREDICT` > > >> >>>> function > > >> >>>>>>> because it takes a model name string as input. I can think of > > >> >> three > > >> >>>>> ways > > >> >>>>>> of > > >> >>>>>>> doing type inference for it. > > >> >>>>>>> 1). Treat `ML_PREDICT` function as something special and > > >> >> during > > >> >>>> sql > > >> >>>>>>> parsing or planning time, if it's encountered, we need to look > > up > > >> >>> the > > >> >>>>>> model > > >> >>>>>>> from the first argument which is a model name from catalog. > Then > > >> >> we > > >> >>>> can > > >> >>>>>>> infer the input/output for the function. > > >> >>>>>>> 2). We can define a `model` keyword and use that in the > > >> >> predict > > >> >>>>>> function > > >> >>>>>>> to indicate the argument refers to a model. So it's like > > >> >>>>>> `ML_PREDICT(model > > >> >>>>>>> 'my_model', col1, col2))` > > >> >>>>>>> 3). We can create a special type of table function maybe > > >> >> called > > >> >>>>>>> `ModelFunction` which can resolve the model type inference by > > >> >>> special > > >> >>>>>>> handling it during parsing or planning time. > > >> >>>>>>> 1) is hacky, 2) isn't supported in Flink for function, 3) > might > > >> >> be > > >> >>> a > > >> >>>>>>> good option. > > >> >>>>>>> > > >> >>>>>>> 3. I sketched the `ML_PREDICT` function for inference. But > there > > >> >>> are > > >> >>>>>>> limitations of the function mentioned in 1 and 2. So maybe we > > >> >> don't > > >> >>>>> need > > >> >>>>>> to > > >> >>>>>>> introduce them as built-in functions until polymorphism table > > >> >>>> function > > >> >>>>>> and > > >> >>>>>>> we can properly deal with type inference. > > >> >>>>>>> After that, defining a user-defined model function should also > > be > > >> >>>>>>> straightforward. > > >> >>>>>>> > > >> >>>>>>> 4. For model types, do you mean 'remote', 'import', 'native' > > >> >> models > > >> >>>> or > > >> >>>>>>> other things? > > >> >>>>>>> > > >> >>>>>>> 5. We could support popular providers such as 'azureml', > > >> >>> 'vertexai', > > >> >>>>>>> 'googleai' as long as we support the `ML_PREDICT` function. > > Users > > >> >>>>> should > > >> >>>>>> be > > >> >>>>>>> able to implement 3rd-party providers if they can implement a > > >> >>>> function > > >> >>>>>>> handling the input/output for the provider. > > >> >>>>>>> > > >> >>>>>>> I think for the model functions, there are still dependencies > or > > >> >>>> hacks > > >> >>>>> we > > >> >>>>>>> need to sort out as a built-in function. Maybe we can separate > > >> >> that > > >> >>>> as > > >> >>>>> a > > >> >>>>>>> follow up if we want to have it built-in and focus on the > model > > >> >>>> syntax > > >> >>>>>> for > > >> >>>>>>> this FLIP? > > >> >>>>>>> > > >> >>>>>>> Thanks, > > >> >>>>>>> Hao > > >> >>>>>>> > > >> >>>>>>> On Tue, Mar 12, 2024 at 10:33 PM Jark Wu <imj...@gmail.com> > > >> >> wrote: > > >> >>>>>>> > > >> >>>>>>>> Hi Minge, Chris, Hao, > > >> >>>>>>>> > > >> >>>>>>>> Thanks for proposing this interesting idea. I think this is a > > >> >>> nice > > >> >>>>> step > > >> >>>>>>>> towards > > >> >>>>>>>> the AI world for Apache Flink. I don't know much about AI/ML, > > >> >> so > > >> >>> I > > >> >>>>> may > > >> >>>>>>> have > > >> >>>>>>>> some stupid questions. > > >> >>>>>>>> > > >> >>>>>>>> 1. Could you tell more about why polymorphism table function > > >> >>> (PTF) > > >> >>>>>>> doesn't > > >> >>>>>>>> work and do we have plan to use PTF as model functions? > > >> >>>>>>>> > > >> >>>>>>>> 2. What kind of object does the model map to in SQL? A > relation > > >> >>> or > > >> >>>> a > > >> >>>>>> data > > >> >>>>>>>> type? > > >> >>>>>>>> It looks like a data type because we use it as a parameter of > > >> >> the > > >> >>>>> table > > >> >>>>>>>> function. > > >> >>>>>>>> If it is a data type, how does it cooperate with type > > >> >>> inference[1]? > > >> >>>>>>>> > > >> >>>>>>>> 3. What built-in model functions will we support? How to > > >> >> define a > > >> >>>>>>>> user-defined model function? > > >> >>>>>>>> > > >> >>>>>>>> 4. What built-in model types will we support? How to define a > > >> >>>>>>> user-defined > > >> >>>>>>>> model type? > > >> >>>>>>>> > > >> >>>>>>>> 5. Regarding the remote model, what providers will we > support? > > >> >>> Can > > >> >>>>>> users > > >> >>>>>>>> implement > > >> >>>>>>>> 3rd-party providers except OpenAI? > > >> >>>>>>>> > > >> >>>>>>>> Best, > > >> >>>>>>>> Jark > > >> >>>>>>>> > > >> >>>>>>>> [1]: > > >> >>>>>>>> > > >> >>>>>>>> > > >> >>>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > https://nightlies.apache.org/flink/flink-docs-master/docs/dev/table/functions/udfs/#type-inference > > >> >>>>>>>> > > >> >>>>>>>> > > >> >>>>>>>> > > >> >>>>>>>> > > >> >>>>>>>> On Wed, 13 Mar 2024 at 05:55, Hao Li > <h...@confluent.io.invalid > > >> >>> > > >> >>>>> wrote: > > >> >>>>>>>> > > >> >>>>>>>>> Hi, Dev > > >> >>>>>>>>> > > >> >>>>>>>>> > > >> >>>>>>>>> Mingge, Chris and I would like to start a discussion about > > >> >>>>> FLIP-437: > > >> >>>>>>>>> Support ML Models in Flink SQL. > > >> >>>>>>>>> > > >> >>>>>>>>> This FLIP is proposing to support machine learning models in > > >> >>>> Flink > > >> >>>>>> SQL > > >> >>>>>>>>> syntax so that users can CRUD models with Flink SQL and use > > >> >>>> models > > >> >>>>> on > > >> >>>>>>>> Flink > > >> >>>>>>>>> to do prediction with Flink data. The FLIP also proposes new > > >> >>>> model > > >> >>>>>>>> entities > > >> >>>>>>>>> and changes to catalog interface to support model CRUD > > >> >>> operations > > >> >>>>> in > > >> >>>>>>>>> catalog. > > >> >>>>>>>>> > > >> >>>>>>>>> For more details, see FLIP-437 [1]. Looking forward to your > > >> >>>>> feedback. > > >> >>>>>>>>> > > >> >>>>>>>>> > > >> >>>>>>>>> [1] > > >> >>>>>>>>> > > >> >>>>>>>>> > > >> >>>>>>>> > > >> >>>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > https://cwiki.apache.org/confluence/display/FLINK/FLIP-437%3A+Support+ML+Models+in+Flink+SQL > > >> >>>>>>>>> > > >> >>>>>>>>> Thanks, > > >> >>>>>>>>> Minge, Chris & Hao > > >> >>>>>>>>> > > >> >>>>>>>> > > >> >>>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > >> > > >> > > >