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

ASF GitHub Bot commented on FLINK-10974:
----------------------------------------

sunjincheng121 commented on a change in pull request #7196: [FLINK-10974] 
[table] Add support for flatMap to table API
URL: https://github.com/apache/flink/pull/7196#discussion_r239295918
 
 

 ##########
 File path: 
flink-libraries/flink-table/src/main/scala/org/apache/flink/table/api/table.scala
 ##########
 @@ -999,6 +1001,131 @@ class Table(
     new OverWindowedTable(this, overWindows.toArray)
   }
 
+  /**
+    * Performs a flatMap operation with an user-defined table function.
+    *
+    * Scala Example:
+    * {{{
+    *   class MyFlatMapFunction extends TableFunction[Row] {
+    *     def eval(str : String) {
+    *       if (str.contains("#")) {
+    *         val splits = str.split("#")
+    *         collect(Row.of(splits(0), splits(1)))
+    *       }
+    *     }
+    *
+    *     def getResultType(signature: Array[Class[_]]): TypeInformation[_] =
+    *       Types.ROW(Types.STRING, Types.STRING)
+    *   }
+    *
+    *   val func = new MyFlatMapFunction()
+    *   table.flatMap(func('c)).as('a, 'b)
+    * }}}
+    *
+    * Java Example:
+    * {{{
+    *   class MyFlatMapFunction extends TableFunction<Row> {
+    *     public void eval(String str) {
+    *       if (str.contains("#")) {
+    *         String[] splits = str.split("#");
+    *         collect(Row.of(splits[0], splits[1]));
+    *       }
+    *     }
+    *
+    *     public TypeInformation getResultType(Class[] signature) {
+    *       return Types.ROW(Types.STRING, Types.STRING);
+    *     }
+    *   }
+    *
+    *   TableFunction func = new MyFlatMapFunction();
+    *   tableEnv.registerFunction("func", func);
+    *   table.flatMap("func(c)").as("a, b");
+    * }}}
+    */
+  def flatMap(tableFunction: Expression): Table = {
+    unwrap(tableFunction, tableEnv) match {
+      case _: TableFunctionCall =>
+      case _ => throw new ValidationException("Only TableFunction can be used 
in flatMap.")
+    }
+
+    // rename output fields names to avoid ambiguous name
+    val originalCall = 
UserDefinedFunctionUtils.createLogicalFunctionCall(tableEnv, tableFunction)
+    val originalOutputFieldNames = originalCall.output.map(_.name)
+    val usedFieldNames: mutable.HashSet[String] = mutable.HashSet()
+    logicalPlan.output.map(_.name).foreach(usedFieldNames.add)
+
+    var i: Int = 0
+    def findNewName(n: String): String = {
+      val newName = n + "_" + i
+      i += 1
+      if (usedFieldNames.contains(newName)) {
+        findNewName(n)
+      } else {
+        usedFieldNames.add(newName)
+        newName
+      }
+    }
+
+    val newOutputFieldNames = originalOutputFieldNames.map(n =>
+      if (usedFieldNames.contains(n)) {
+        findNewName(n)
+      } else {
+        n
+      }
+    )
 
 Review comment:
   The logic of gen the new output field name can be changed as follows:
   ```
    val newOutputFieldNames = originalOutputFieldNames.zipWithIndex.map( {
         case (name, index) => if(usedFieldNames.contains(name)){
           index + "_" + name
         }else {
           name
         }
       }).toArray.sorted
   ```
   What do you think?

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


> Add FlatMap to TableAPI
> -----------------------
>
>                 Key: FLINK-10974
>                 URL: https://issues.apache.org/jira/browse/FLINK-10974
>             Project: Flink
>          Issue Type: Sub-task
>          Components: Table API &amp; SQL
>            Reporter: sunjincheng
>            Assignee: Dian Fu
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 1.8.0
>
>
> Add FlatMap operator to Table API as described in [Google 
> doc|https://docs.google.com/document/d/1tnpxg31EQz2-MEzSotwFzqatsB4rNLz0I-l_vPa5H4Q/edit#heading=h.q23rny2iglsr].
> The usage:
> {code:java}
> val res = tab
>    .flatMap(fun: TableFunction)  // output has columns 'a, 'b, 'c
>    .select('a, 'c)
> {code}



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

Reply via email to