dianfu commented on a change in pull request #13314:
URL: https://github.com/apache/flink/pull/13314#discussion_r484194228



##########
File path: docs/dev/python/table-api-users-guide/intro_to_table_api.md
##########
@@ -109,6 +109,8 @@ table_env = 
BatchTableEnvironment.create(environment_settings=env_settings)
 
 {% endhighlight %}
 
+For more details about different ways to create a `TableEnvironment`, please 
refer to the [TableEnvironment Documentation]({% link 
dev/python/table-api-users-guide/table_environment.md 
%}#create-a-tableenvironment).

Review comment:
       ```suggestion
   For more details about the different ways to create a `TableEnvironment`, 
please refer to the [TableEnvironment Documentation]({% link 
dev/python/table-api-users-guide/table_environment.md 
%}#create-a-tableenvironment).
   ```

##########
File path: docs/dev/python/table-api-users-guide/table_environment.md
##########
@@ -0,0 +1,838 @@
+---
+title: "TableEnvironment"
+nav-parent_id: python_tableapi
+nav-pos: 27
+---
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+This document is an introduction of PyFlink `TableEnvironment`. 
+It includes detailed descriptions of every public interface of the 
`TableEnvironment` class.
+
+* This will be replaced by the TOC
+{:toc}
+
+Create a TableEnvironment
+-------------------------
+
+The recommended way to create a `TableEnvironment` is to create from an 
`EnvironmentSettings` object:
+
+{% highlight python %}
+
+from pyflink.table import EnvironmentSettings, StreamTableEnvironment, 
BatchTableEnvironment
+
+# create a blink streaming TableEnvironment
+table_env = 
StreamTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_blink_planner().build())
+
+# create a blink batch TableEnvironment
+table_env = 
BatchTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_batch_mode().use_blink_planner().build())
+
+# create a flink streaming TableEnvironment
+table_env = 
StreamTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_old_planner().build())
+
+# create a flink batch TableEnvironment
+table_env = 
BatchTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_batch_mode().use_old_planner().build())
+
+{% endhighlight %}
+
+If you need to access the `ExecutionEnvironment`/`StreamExecutionEnvironment` 
object which the `TableEnvironment` based on,
+e.g. mixing with DataStream API, configuring via the APIs of 
`ExecutionEnvironment`/`StreamExecutionEnvironment`, 
+you can also create a `TableEnvironment` from an 
`ExecutionEnvironment`/`StreamExecutionEnvironment` with a optional 
`TableConfig` object:
+
+{% highlight python %}
+
+from pyflink.dataset import ExecutionEnvironment
+from pyflink.datastream import StreamExecutionEnvironment
+from pyflink.table import StreamTableEnvironment, BatchTableEnvironment, 
TableConfig
+
+# create a blink streaming TableEnvironment from a StreamExecutionEnvironment
+env = StreamExecutionEnvironment.get_execution_environment()
+table_env = StreamTableEnvironment.create(env)
+
+# create a blink streaming TableEnvironment from a StreamExecutionEnvironment 
with a TableConfig
+env = StreamExecutionEnvironment.get_execution_environment()
+table_config = TableConfig()  # you can add configuration options in it
+table_env = StreamTableEnvironment.create(env, table_config)
+
+# create a flink streaming TableEnvironment from a StreamExecutionEnvironment
+env = StreamExecutionEnvironment.get_execution_environment()
+table_env = StreamTableEnvironment.create(env, 
environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_old_planner().build())
+
+# create a flink batch TableEnvironment from an ExecutionEnvironment
+env = ExecutionEnvironment.get_execution_environment()
+table_env = BatchTableEnvironment.create(env)
+
+# create a flink batch TableEnvironment from an ExecutionEnvironment with a 
TableConfig
+env = ExecutionEnvironment.get_execution_environment()
+table_config = TableConfig()  # you can add configuration options in it
+table_env = BatchTableEnvironment.create(env, table_config)
+
+{% endhighlight %}
+
+**Note:** Almost all the configurations in 
`ExecutionEnvironment`/`StreamExecutionEnvironment` can be configured via 
`TableEnvironment.get_config()` now, see [Configuration]({% link ops/config.md 
%}) for more details.
+Only a few rarely used or deprecated configurations still require direct 
access to `ExecutionEnvironment` /`StreamExecutionEnvironment` for configuring, 
e.g. the input dependency constraint.
+
+TableEnvironment API
+--------------------
+
+### Table/SQL Operations
+
+These APIs are used to create/remove Table API/SQL Tables and write queries:
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>from_elements(elements, schema=None, 
verify_schema=True)</strong>
+      </td>
+      <td>
+        Creates a table from a collection of elements. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_elements">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>from_pandas(pdf, schema=None, split_num=1)</strong>
+      </td>
+      <td>
+        Creates a table from a pandas DataFrame. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_pandas">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>from_path(path)</strong>
+      </td>
+      <td>
+        Reads a registered table from catalog and returns the resulting 
`Table` object. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_path">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>sql_query(query)</strong>
+      </td>
+      <td>
+        Evaluates a SQL query on registered tables and retrieves the result as 
a `Table` object. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.sql_query">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_temporary_view(view_path, table)</strong>
+      </td>
+      <td>
+        Registers a `Table` object as a temporary view similar to SQL 
temporary views. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_temporary_view">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>drop_temporary_view(view_path)</strong>
+      </td>
+      <td>
+        Drops a temporary view registered in the given path. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.drop_temporary_view">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>drop_temporary_table(table_path)</strong>
+      </td>
+      <td>
+        Drops a temporary table registered in the given path. 
+        You can use this interface to drop the temporary source table and 
temporary sink table.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.drop_temporary_table">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>execute_sql(stmt)</strong>
+      </td>
+      <td>
+        Execute the given single statement, and return the execution result.
+        The statement can be DDL/DML/DQL/SHOW/DESCRIBE/EXPLAIN/USE.
+        Note that for "INSERT INTO" statement this is an async operation.
+        This is usually expected when submitting a job to a remote cluster. 
However, when executing a job in a mini cluster or IDE, you need to wait until 
the job execution finished, then you can refer to the following code: <br>

Review comment:
       Add a reference to 
https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/python/faq.html#wait-for-jobs-to-finish-when-executing-jobs-in-mini-cluster?
 It has detailed explanation about this.

##########
File path: docs/dev/python/table-api-users-guide/table_environment.md
##########
@@ -0,0 +1,838 @@
+---
+title: "TableEnvironment"
+nav-parent_id: python_tableapi
+nav-pos: 27
+---
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+This document is an introduction of PyFlink `TableEnvironment`. 
+It includes detailed descriptions of every public interface of the 
`TableEnvironment` class.
+
+* This will be replaced by the TOC
+{:toc}
+
+Create a TableEnvironment
+-------------------------
+
+The recommended way to create a `TableEnvironment` is to create from an 
`EnvironmentSettings` object:
+
+{% highlight python %}
+
+from pyflink.table import EnvironmentSettings, StreamTableEnvironment, 
BatchTableEnvironment
+
+# create a blink streaming TableEnvironment
+table_env = 
StreamTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_blink_planner().build())
+
+# create a blink batch TableEnvironment
+table_env = 
BatchTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_batch_mode().use_blink_planner().build())
+
+# create a flink streaming TableEnvironment
+table_env = 
StreamTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_old_planner().build())
+
+# create a flink batch TableEnvironment
+table_env = 
BatchTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_batch_mode().use_old_planner().build())
+
+{% endhighlight %}
+
+If you need to access the `ExecutionEnvironment`/`StreamExecutionEnvironment` 
object which the `TableEnvironment` based on,
+e.g. mixing with DataStream API, configuring via the APIs of 
`ExecutionEnvironment`/`StreamExecutionEnvironment`, 
+you can also create a `TableEnvironment` from an 
`ExecutionEnvironment`/`StreamExecutionEnvironment` with a optional 
`TableConfig` object:
+
+{% highlight python %}
+
+from pyflink.dataset import ExecutionEnvironment
+from pyflink.datastream import StreamExecutionEnvironment
+from pyflink.table import StreamTableEnvironment, BatchTableEnvironment, 
TableConfig
+
+# create a blink streaming TableEnvironment from a StreamExecutionEnvironment
+env = StreamExecutionEnvironment.get_execution_environment()
+table_env = StreamTableEnvironment.create(env)
+
+# create a blink streaming TableEnvironment from a StreamExecutionEnvironment 
with a TableConfig
+env = StreamExecutionEnvironment.get_execution_environment()
+table_config = TableConfig()  # you can add configuration options in it
+table_env = StreamTableEnvironment.create(env, table_config)
+
+# create a flink streaming TableEnvironment from a StreamExecutionEnvironment
+env = StreamExecutionEnvironment.get_execution_environment()
+table_env = StreamTableEnvironment.create(env, 
environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_old_planner().build())
+
+# create a flink batch TableEnvironment from an ExecutionEnvironment
+env = ExecutionEnvironment.get_execution_environment()
+table_env = BatchTableEnvironment.create(env)
+
+# create a flink batch TableEnvironment from an ExecutionEnvironment with a 
TableConfig
+env = ExecutionEnvironment.get_execution_environment()
+table_config = TableConfig()  # you can add configuration options in it
+table_env = BatchTableEnvironment.create(env, table_config)
+
+{% endhighlight %}
+
+**Note:** Almost all the configurations in 
`ExecutionEnvironment`/`StreamExecutionEnvironment` can be configured via 
`TableEnvironment.get_config()` now, see [Configuration]({% link ops/config.md 
%}) for more details.
+Only a few rarely used or deprecated configurations still require direct 
access to `ExecutionEnvironment` /`StreamExecutionEnvironment` for configuring, 
e.g. the input dependency constraint.
+
+TableEnvironment API
+--------------------
+
+### Table/SQL Operations
+
+These APIs are used to create/remove Table API/SQL Tables and write queries:
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>from_elements(elements, schema=None, 
verify_schema=True)</strong>
+      </td>
+      <td>
+        Creates a table from a collection of elements. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_elements">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>from_pandas(pdf, schema=None, split_num=1)</strong>
+      </td>
+      <td>
+        Creates a table from a pandas DataFrame. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_pandas">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>from_path(path)</strong>
+      </td>
+      <td>
+        Reads a registered table from catalog and returns the resulting 
`Table` object. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_path">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>sql_query(query)</strong>
+      </td>
+      <td>
+        Evaluates a SQL query on registered tables and retrieves the result as 
a `Table` object. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.sql_query">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_temporary_view(view_path, table)</strong>
+      </td>
+      <td>
+        Registers a `Table` object as a temporary view similar to SQL 
temporary views. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_temporary_view">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>drop_temporary_view(view_path)</strong>
+      </td>
+      <td>
+        Drops a temporary view registered in the given path. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.drop_temporary_view">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>drop_temporary_table(table_path)</strong>
+      </td>
+      <td>
+        Drops a temporary table registered in the given path. 
+        You can use this interface to drop the temporary source table and 
temporary sink table.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.drop_temporary_table">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>execute_sql(stmt)</strong>
+      </td>
+      <td>
+        Execute the given single statement, and return the execution result.
+        The statement can be DDL/DML/DQL/SHOW/DESCRIBE/EXPLAIN/USE.
+        Note that for "INSERT INTO" statement this is an async operation.
+        This is usually expected when submitting a job to a remote cluster. 
However, when executing a job in a mini cluster or IDE, you need to wait until 
the job execution finished, then you can refer to the following code: <br>
+{% highlight python %}
+table_env.execute_sql(stmt).get_job_client().get_job_execution_result().result()
+{% endhighlight %}
+        For more details please see the <a href="{{ site.baseurl 
}}/dev/table/sql/">SQL</a> documentation.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.execute_sql">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+<big><strong>Deprecated APIs</strong></big>
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>from_table_source(table_source)</strong>
+      </td>
+      <td>
+        Creates a table from a table source. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_table_source">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>scan(*table_path)</strong>
+      </td>
+      <td>
+        Scans a registered table from catalog and returns the resulting Table.
+        It can be replaced by <strong>from_path</strong>.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.scan">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>register_table(name, table)</strong>
+      </td>
+      <td>
+        Registers a `Table` object under a unique name in the 
TableEnvironment's catalog. 
+        Registered tables can be referenced in SQL queries.
+        It can be replaced by <strong>create_temporary_view</strong>.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.register_table">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>register_table_source(name, table_source)</strong>
+      </td>
+      <td>
+        Registers an external `TableSource` in the TableEnvironment's catalog.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.register_table_source">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>register_table_sink(name, table_sink)</strong>
+      </td>
+      <td>
+        Registers an external `TableSink` in the TableEnvironment's catalog.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.register_table_sink">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>insert_into(target_path, table)</strong>
+      </td>
+      <td>
+        Instructs to write the content of a `Table` object into a sink table.
+        Note that this interface would not trigger the execution of jobs.
+        You need to call the "execute" method to execute your job.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.insert_into">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>sql_update(stmt)</strong>
+      </td>
+      <td>
+        Evaluates a SQL statement such as INSERT, UPDATE or DELETE or a DDL 
statement.
+        It can be replaced by "execute_sql".
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.sql_update">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>connect(connector_descriptor)</strong>
+      </td>
+      <td>
+        Creates a temporary table from a descriptor. 
+        Currently the recommended way is using "execute_sql" to register 
temporary tables.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.connect">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+### Execute/Explain Jobs
+
+These APIs are used to explain/execute jobs. Note that the API `execute_sql` 
can also be used to execute job.
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>explain_sql(stmt, *extra_details)</strong>
+      </td>
+      <td>
+        Returns the AST of the specified statement and the execution plan.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.explain_sql">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_statement_set()</strong>
+      </td>
+      <td>
+        Creates a StatementSet instance which accepts DML statements or Tables.
+        It can be used to execute a multi-sink job. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_statement_set">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+<big><strong>Deprecated APIs</strong></big>
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>explain(table=None, extended=False)</strong>
+      </td>
+      <td>
+        Returns the AST of the specified Table API and SQL queries and the 
execution plan to compute
+        the result of the given `Table` object or multi-sinks plan.
+        If you use the "insert_into" or "sql_update" method to emit data to 
multiple sinks, you can use this
+        method to get the plan.
+        It can be replaced by "explain_sql", `Table`.explain or 
`StatementSet`.explain().
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.explain">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>execute(job_name)</strong>
+      </td>
+      <td>
+        Triggers the program execution. The environment will execute all parts 
of the program.
+        If you use the "insert_into" or "sql_update" method to emit data to 
sinks, you can use this
+        method trigger the program execution.
+        This method will block the client program until the job is 
finished/canceled/failed.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.execute">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+### Create/Drop User Defined Functions
+
+These APIs are used to register UDFs or remove the registered UDFs. 
+Note that the API `execute_sql` can also be used to register/remove UDFs.
+For more introduction about different kinds of UDF, please refer to [User 
Defined Functions]({% link dev/table/functions/index.md %}).
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>create_temporary_function(path, function)</strong>
+      </td>
+      <td>
+        Registers a python user defined function class as a temporary catalog 
function.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_temporary_function">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_temporary_system_function(name, function)</strong>
+      </td>
+      <td>
+        Registers a python user defined function class as a temporary system 
function.
+        If the name of a temporary system function is the same as a temporary 
catalog function,
+        the temporary system function takes precedence.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_temporary_system_function">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_java_function(path, function_class_name, 
ignore_if_exists=None)</strong>
+      </td>
+      <td>
+        Registers a java user defined function class as a catalog function in 
the given path.
+        If the catalog is persistent, the register catalog function can be 
used across multiple Flink sessions and clusters.

Review comment:
       ```suggestion
           If the catalog is persistent, the registered catalog function can be 
used across multiple Flink sessions and clusters.
   ```

##########
File path: docs/dev/python/table-api-users-guide/table_environment.md
##########
@@ -0,0 +1,838 @@
+---
+title: "TableEnvironment"
+nav-parent_id: python_tableapi
+nav-pos: 27
+---
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+This document is an introduction of PyFlink `TableEnvironment`. 
+It includes detailed descriptions of every public interface of the 
`TableEnvironment` class.
+
+* This will be replaced by the TOC
+{:toc}
+
+Create a TableEnvironment
+-------------------------
+
+The recommended way to create a `TableEnvironment` is to create from an 
`EnvironmentSettings` object:
+
+{% highlight python %}
+
+from pyflink.table import EnvironmentSettings, StreamTableEnvironment, 
BatchTableEnvironment
+
+# create a blink streaming TableEnvironment
+table_env = 
StreamTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_blink_planner().build())
+
+# create a blink batch TableEnvironment
+table_env = 
BatchTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_batch_mode().use_blink_planner().build())
+
+# create a flink streaming TableEnvironment
+table_env = 
StreamTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_old_planner().build())
+
+# create a flink batch TableEnvironment
+table_env = 
BatchTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_batch_mode().use_old_planner().build())
+
+{% endhighlight %}
+
+If you need to access the `ExecutionEnvironment`/`StreamExecutionEnvironment` 
object which the `TableEnvironment` based on,
+e.g. mixing with DataStream API, configuring via the APIs of 
`ExecutionEnvironment`/`StreamExecutionEnvironment`, 
+you can also create a `TableEnvironment` from an 
`ExecutionEnvironment`/`StreamExecutionEnvironment` with a optional 
`TableConfig` object:
+
+{% highlight python %}
+
+from pyflink.dataset import ExecutionEnvironment
+from pyflink.datastream import StreamExecutionEnvironment
+from pyflink.table import StreamTableEnvironment, BatchTableEnvironment, 
TableConfig
+
+# create a blink streaming TableEnvironment from a StreamExecutionEnvironment
+env = StreamExecutionEnvironment.get_execution_environment()
+table_env = StreamTableEnvironment.create(env)
+
+# create a blink streaming TableEnvironment from a StreamExecutionEnvironment 
with a TableConfig
+env = StreamExecutionEnvironment.get_execution_environment()
+table_config = TableConfig()  # you can add configuration options in it
+table_env = StreamTableEnvironment.create(env, table_config)
+
+# create a flink streaming TableEnvironment from a StreamExecutionEnvironment
+env = StreamExecutionEnvironment.get_execution_environment()
+table_env = StreamTableEnvironment.create(env, 
environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_old_planner().build())
+
+# create a flink batch TableEnvironment from an ExecutionEnvironment
+env = ExecutionEnvironment.get_execution_environment()
+table_env = BatchTableEnvironment.create(env)
+
+# create a flink batch TableEnvironment from an ExecutionEnvironment with a 
TableConfig
+env = ExecutionEnvironment.get_execution_environment()
+table_config = TableConfig()  # you can add configuration options in it
+table_env = BatchTableEnvironment.create(env, table_config)
+
+{% endhighlight %}
+
+**Note:** Almost all the configurations in 
`ExecutionEnvironment`/`StreamExecutionEnvironment` can be configured via 
`TableEnvironment.get_config()` now, see [Configuration]({% link ops/config.md 
%}) for more details.
+Only a few rarely used or deprecated configurations still require direct 
access to `ExecutionEnvironment` /`StreamExecutionEnvironment` for configuring, 
e.g. the input dependency constraint.
+
+TableEnvironment API
+--------------------
+
+### Table/SQL Operations
+
+These APIs are used to create/remove Table API/SQL Tables and write queries:
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>from_elements(elements, schema=None, 
verify_schema=True)</strong>
+      </td>
+      <td>
+        Creates a table from a collection of elements. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_elements">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>from_pandas(pdf, schema=None, split_num=1)</strong>
+      </td>
+      <td>
+        Creates a table from a pandas DataFrame. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_pandas">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>from_path(path)</strong>
+      </td>
+      <td>
+        Reads a registered table from catalog and returns the resulting 
`Table` object. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_path">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>sql_query(query)</strong>
+      </td>
+      <td>
+        Evaluates a SQL query on registered tables and retrieves the result as 
a `Table` object. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.sql_query">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_temporary_view(view_path, table)</strong>
+      </td>
+      <td>
+        Registers a `Table` object as a temporary view similar to SQL 
temporary views. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_temporary_view">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>drop_temporary_view(view_path)</strong>
+      </td>
+      <td>
+        Drops a temporary view registered in the given path. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.drop_temporary_view">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>drop_temporary_table(table_path)</strong>
+      </td>
+      <td>
+        Drops a temporary table registered in the given path. 
+        You can use this interface to drop the temporary source table and 
temporary sink table.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.drop_temporary_table">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>execute_sql(stmt)</strong>
+      </td>
+      <td>
+        Execute the given single statement, and return the execution result.
+        The statement can be DDL/DML/DQL/SHOW/DESCRIBE/EXPLAIN/USE.
+        Note that for "INSERT INTO" statement this is an async operation.

Review comment:
       ```suggestion
           Note that for "INSERT INTO" statement this is an asynchronous 
operation.
   ```

##########
File path: docs/dev/python/table-api-users-guide/intro_to_table_api.zh.md
##########
@@ -109,6 +109,8 @@ table_env = 
BatchTableEnvironment.create(environment_settings=env_settings)
 
 {% endhighlight %}
 
+For more details about different ways to create a `TableEnvironment`, please 
refer to the [TableEnvironment Documentation]({% link 
dev/python/table-api-users-guide/table_environment.md 
%}#create-a-tableenvironment).

Review comment:
       ```suggestion
   For more details about different ways to create a `TableEnvironment`, please 
refer to the [TableEnvironment Documentation]({% link 
dev/python/table-api-users-guide/table_environment.zh.md 
%}#create-a-tableenvironment).
   ```

##########
File path: docs/dev/python/table-api-users-guide/table_environment.md
##########
@@ -0,0 +1,838 @@
+---
+title: "TableEnvironment"
+nav-parent_id: python_tableapi
+nav-pos: 27
+---
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+This document is an introduction of PyFlink `TableEnvironment`. 
+It includes detailed descriptions of every public interface of the 
`TableEnvironment` class.
+
+* This will be replaced by the TOC
+{:toc}
+
+Create a TableEnvironment
+-------------------------
+
+The recommended way to create a `TableEnvironment` is to create from an 
`EnvironmentSettings` object:
+
+{% highlight python %}
+
+from pyflink.table import EnvironmentSettings, StreamTableEnvironment, 
BatchTableEnvironment
+
+# create a blink streaming TableEnvironment
+table_env = 
StreamTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_blink_planner().build())
+
+# create a blink batch TableEnvironment
+table_env = 
BatchTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_batch_mode().use_blink_planner().build())
+
+# create a flink streaming TableEnvironment
+table_env = 
StreamTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_old_planner().build())
+
+# create a flink batch TableEnvironment
+table_env = 
BatchTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_batch_mode().use_old_planner().build())
+
+{% endhighlight %}
+
+If you need to access the `ExecutionEnvironment`/`StreamExecutionEnvironment` 
object which the `TableEnvironment` based on,
+e.g. mixing with DataStream API, configuring via the APIs of 
`ExecutionEnvironment`/`StreamExecutionEnvironment`, 
+you can also create a `TableEnvironment` from an 
`ExecutionEnvironment`/`StreamExecutionEnvironment` with a optional 
`TableConfig` object:
+
+{% highlight python %}
+
+from pyflink.dataset import ExecutionEnvironment
+from pyflink.datastream import StreamExecutionEnvironment
+from pyflink.table import StreamTableEnvironment, BatchTableEnvironment, 
TableConfig
+
+# create a blink streaming TableEnvironment from a StreamExecutionEnvironment
+env = StreamExecutionEnvironment.get_execution_environment()
+table_env = StreamTableEnvironment.create(env)
+
+# create a blink streaming TableEnvironment from a StreamExecutionEnvironment 
with a TableConfig
+env = StreamExecutionEnvironment.get_execution_environment()
+table_config = TableConfig()  # you can add configuration options in it
+table_env = StreamTableEnvironment.create(env, table_config)
+
+# create a flink streaming TableEnvironment from a StreamExecutionEnvironment
+env = StreamExecutionEnvironment.get_execution_environment()
+table_env = StreamTableEnvironment.create(env, 
environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_old_planner().build())
+
+# create a flink batch TableEnvironment from an ExecutionEnvironment
+env = ExecutionEnvironment.get_execution_environment()
+table_env = BatchTableEnvironment.create(env)
+
+# create a flink batch TableEnvironment from an ExecutionEnvironment with a 
TableConfig
+env = ExecutionEnvironment.get_execution_environment()
+table_config = TableConfig()  # you can add configuration options in it
+table_env = BatchTableEnvironment.create(env, table_config)
+
+{% endhighlight %}
+
+**Note:** Almost all the configurations in 
`ExecutionEnvironment`/`StreamExecutionEnvironment` can be configured via 
`TableEnvironment.get_config()` now, see [Configuration]({% link ops/config.md 
%}) for more details.
+Only a few rarely used or deprecated configurations still require direct 
access to `ExecutionEnvironment` /`StreamExecutionEnvironment` for configuring, 
e.g. the input dependency constraint.
+
+TableEnvironment API
+--------------------
+
+### Table/SQL Operations
+
+These APIs are used to create/remove Table API/SQL Tables and write queries:
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>from_elements(elements, schema=None, 
verify_schema=True)</strong>
+      </td>
+      <td>
+        Creates a table from a collection of elements. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_elements">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>from_pandas(pdf, schema=None, split_num=1)</strong>
+      </td>
+      <td>
+        Creates a table from a pandas DataFrame. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_pandas">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>from_path(path)</strong>
+      </td>
+      <td>
+        Reads a registered table from catalog and returns the resulting 
`Table` object. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_path">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>sql_query(query)</strong>
+      </td>
+      <td>
+        Evaluates a SQL query on registered tables and retrieves the result as 
a `Table` object. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.sql_query">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_temporary_view(view_path, table)</strong>
+      </td>
+      <td>
+        Registers a `Table` object as a temporary view similar to SQL 
temporary views. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_temporary_view">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>drop_temporary_view(view_path)</strong>
+      </td>
+      <td>
+        Drops a temporary view registered in the given path. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.drop_temporary_view">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>drop_temporary_table(table_path)</strong>
+      </td>
+      <td>
+        Drops a temporary table registered in the given path. 
+        You can use this interface to drop the temporary source table and 
temporary sink table.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.drop_temporary_table">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>execute_sql(stmt)</strong>
+      </td>
+      <td>
+        Execute the given single statement, and return the execution result.
+        The statement can be DDL/DML/DQL/SHOW/DESCRIBE/EXPLAIN/USE.
+        Note that for "INSERT INTO" statement this is an async operation.
+        This is usually expected when submitting a job to a remote cluster. 
However, when executing a job in a mini cluster or IDE, you need to wait until 
the job execution finished, then you can refer to the following code: <br>
+{% highlight python %}
+table_env.execute_sql(stmt).get_job_client().get_job_execution_result().result()
+{% endhighlight %}
+        For more details please see the <a href="{{ site.baseurl 
}}/dev/table/sql/">SQL</a> documentation.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.execute_sql">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+<big><strong>Deprecated APIs</strong></big>
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>from_table_source(table_source)</strong>
+      </td>
+      <td>
+        Creates a table from a table source. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_table_source">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>scan(*table_path)</strong>
+      </td>
+      <td>
+        Scans a registered table from catalog and returns the resulting Table.
+        It can be replaced by <strong>from_path</strong>.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.scan">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>register_table(name, table)</strong>
+      </td>
+      <td>
+        Registers a `Table` object under a unique name in the 
TableEnvironment's catalog. 
+        Registered tables can be referenced in SQL queries.
+        It can be replaced by <strong>create_temporary_view</strong>.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.register_table">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>register_table_source(name, table_source)</strong>
+      </td>
+      <td>
+        Registers an external `TableSource` in the TableEnvironment's catalog.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.register_table_source">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>register_table_sink(name, table_sink)</strong>
+      </td>
+      <td>
+        Registers an external `TableSink` in the TableEnvironment's catalog.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.register_table_sink">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>insert_into(target_path, table)</strong>
+      </td>
+      <td>
+        Instructs to write the content of a `Table` object into a sink table.
+        Note that this interface would not trigger the execution of jobs.
+        You need to call the "execute" method to execute your job.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.insert_into">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>sql_update(stmt)</strong>
+      </td>
+      <td>
+        Evaluates a SQL statement such as INSERT, UPDATE or DELETE or a DDL 
statement.
+        It can be replaced by "execute_sql".
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.sql_update">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>connect(connector_descriptor)</strong>
+      </td>
+      <td>
+        Creates a temporary table from a descriptor. 
+        Currently the recommended way is using "execute_sql" to register 
temporary tables.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.connect">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+### Execute/Explain Jobs
+
+These APIs are used to explain/execute jobs. Note that the API `execute_sql` 
can also be used to execute job.

Review comment:
       ```suggestion
   These APIs are used to explain/execute jobs. Note that the API `execute_sql` 
can also be used to execute jobs.
   ```

##########
File path: docs/dev/python/table-api-users-guide/table_environment.md
##########
@@ -0,0 +1,838 @@
+---
+title: "TableEnvironment"
+nav-parent_id: python_tableapi
+nav-pos: 27
+---
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+This document is an introduction of PyFlink `TableEnvironment`. 
+It includes detailed descriptions of every public interface of the 
`TableEnvironment` class.
+
+* This will be replaced by the TOC
+{:toc}
+
+Create a TableEnvironment
+-------------------------
+
+The recommended way to create a `TableEnvironment` is to create from an 
`EnvironmentSettings` object:
+
+{% highlight python %}
+
+from pyflink.table import EnvironmentSettings, StreamTableEnvironment, 
BatchTableEnvironment
+
+# create a blink streaming TableEnvironment
+table_env = 
StreamTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_blink_planner().build())
+
+# create a blink batch TableEnvironment
+table_env = 
BatchTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_batch_mode().use_blink_planner().build())
+
+# create a flink streaming TableEnvironment
+table_env = 
StreamTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_old_planner().build())
+
+# create a flink batch TableEnvironment
+table_env = 
BatchTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_batch_mode().use_old_planner().build())
+
+{% endhighlight %}
+
+If you need to access the `ExecutionEnvironment`/`StreamExecutionEnvironment` 
object which the `TableEnvironment` based on,
+e.g. mixing with DataStream API, configuring via the APIs of 
`ExecutionEnvironment`/`StreamExecutionEnvironment`, 
+you can also create a `TableEnvironment` from an 
`ExecutionEnvironment`/`StreamExecutionEnvironment` with a optional 
`TableConfig` object:
+
+{% highlight python %}
+
+from pyflink.dataset import ExecutionEnvironment
+from pyflink.datastream import StreamExecutionEnvironment
+from pyflink.table import StreamTableEnvironment, BatchTableEnvironment, 
TableConfig
+
+# create a blink streaming TableEnvironment from a StreamExecutionEnvironment
+env = StreamExecutionEnvironment.get_execution_environment()
+table_env = StreamTableEnvironment.create(env)
+
+# create a blink streaming TableEnvironment from a StreamExecutionEnvironment 
with a TableConfig
+env = StreamExecutionEnvironment.get_execution_environment()
+table_config = TableConfig()  # you can add configuration options in it
+table_env = StreamTableEnvironment.create(env, table_config)
+
+# create a flink streaming TableEnvironment from a StreamExecutionEnvironment
+env = StreamExecutionEnvironment.get_execution_environment()
+table_env = StreamTableEnvironment.create(env, 
environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_old_planner().build())
+
+# create a flink batch TableEnvironment from an ExecutionEnvironment
+env = ExecutionEnvironment.get_execution_environment()
+table_env = BatchTableEnvironment.create(env)
+
+# create a flink batch TableEnvironment from an ExecutionEnvironment with a 
TableConfig
+env = ExecutionEnvironment.get_execution_environment()
+table_config = TableConfig()  # you can add configuration options in it
+table_env = BatchTableEnvironment.create(env, table_config)
+
+{% endhighlight %}
+
+**Note:** Almost all the configurations in 
`ExecutionEnvironment`/`StreamExecutionEnvironment` can be configured via 
`TableEnvironment.get_config()` now, see [Configuration]({% link ops/config.md 
%}) for more details.
+Only a few rarely used or deprecated configurations still require direct 
access to `ExecutionEnvironment` /`StreamExecutionEnvironment` for configuring, 
e.g. the input dependency constraint.
+
+TableEnvironment API
+--------------------
+
+### Table/SQL Operations
+
+These APIs are used to create/remove Table API/SQL Tables and write queries:
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>from_elements(elements, schema=None, 
verify_schema=True)</strong>
+      </td>
+      <td>
+        Creates a table from a collection of elements. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_elements">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>from_pandas(pdf, schema=None, split_num=1)</strong>
+      </td>
+      <td>
+        Creates a table from a pandas DataFrame. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_pandas">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>from_path(path)</strong>
+      </td>
+      <td>
+        Reads a registered table from catalog and returns the resulting 
`Table` object. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_path">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>sql_query(query)</strong>
+      </td>
+      <td>
+        Evaluates a SQL query on registered tables and retrieves the result as 
a `Table` object. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.sql_query">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_temporary_view(view_path, table)</strong>
+      </td>
+      <td>
+        Registers a `Table` object as a temporary view similar to SQL 
temporary views. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_temporary_view">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>drop_temporary_view(view_path)</strong>
+      </td>
+      <td>
+        Drops a temporary view registered in the given path. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.drop_temporary_view">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>drop_temporary_table(table_path)</strong>
+      </td>
+      <td>
+        Drops a temporary table registered in the given path. 
+        You can use this interface to drop the temporary source table and 
temporary sink table.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.drop_temporary_table">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>execute_sql(stmt)</strong>
+      </td>
+      <td>
+        Execute the given single statement, and return the execution result.
+        The statement can be DDL/DML/DQL/SHOW/DESCRIBE/EXPLAIN/USE.
+        Note that for "INSERT INTO" statement this is an async operation.
+        This is usually expected when submitting a job to a remote cluster. 
However, when executing a job in a mini cluster or IDE, you need to wait until 
the job execution finished, then you can refer to the following code: <br>
+{% highlight python %}
+table_env.execute_sql(stmt).get_job_client().get_job_execution_result().result()
+{% endhighlight %}
+        For more details please see the <a href="{{ site.baseurl 
}}/dev/table/sql/">SQL</a> documentation.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.execute_sql">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+<big><strong>Deprecated APIs</strong></big>
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>from_table_source(table_source)</strong>
+      </td>
+      <td>
+        Creates a table from a table source. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_table_source">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>scan(*table_path)</strong>
+      </td>
+      <td>
+        Scans a registered table from catalog and returns the resulting Table.
+        It can be replaced by <strong>from_path</strong>.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.scan">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>register_table(name, table)</strong>
+      </td>
+      <td>
+        Registers a `Table` object under a unique name in the 
TableEnvironment's catalog. 
+        Registered tables can be referenced in SQL queries.
+        It can be replaced by <strong>create_temporary_view</strong>.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.register_table">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>register_table_source(name, table_source)</strong>
+      </td>
+      <td>
+        Registers an external `TableSource` in the TableEnvironment's catalog.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.register_table_source">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>register_table_sink(name, table_sink)</strong>
+      </td>
+      <td>
+        Registers an external `TableSink` in the TableEnvironment's catalog.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.register_table_sink">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>insert_into(target_path, table)</strong>
+      </td>
+      <td>
+        Instructs to write the content of a `Table` object into a sink table.
+        Note that this interface would not trigger the execution of jobs.
+        You need to call the "execute" method to execute your job.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.insert_into">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>sql_update(stmt)</strong>
+      </td>
+      <td>
+        Evaluates a SQL statement such as INSERT, UPDATE or DELETE or a DDL 
statement.
+        It can be replaced by "execute_sql".
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.sql_update">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>connect(connector_descriptor)</strong>
+      </td>
+      <td>
+        Creates a temporary table from a descriptor. 
+        Currently the recommended way is using "execute_sql" to register 
temporary tables.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.connect">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+### Execute/Explain Jobs
+
+These APIs are used to explain/execute jobs. Note that the API `execute_sql` 
can also be used to execute job.
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>explain_sql(stmt, *extra_details)</strong>
+      </td>
+      <td>
+        Returns the AST of the specified statement and the execution plan.

Review comment:
       ```suggestion
           Returns the AST and the execution plan of the specified statement.
   ```

##########
File path: docs/dev/python/table-api-users-guide/table_environment.md
##########
@@ -0,0 +1,838 @@
+---
+title: "TableEnvironment"
+nav-parent_id: python_tableapi
+nav-pos: 27
+---
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+This document is an introduction of PyFlink `TableEnvironment`. 
+It includes detailed descriptions of every public interface of the 
`TableEnvironment` class.
+
+* This will be replaced by the TOC
+{:toc}
+
+Create a TableEnvironment
+-------------------------
+
+The recommended way to create a `TableEnvironment` is to create from an 
`EnvironmentSettings` object:
+
+{% highlight python %}
+
+from pyflink.table import EnvironmentSettings, StreamTableEnvironment, 
BatchTableEnvironment
+
+# create a blink streaming TableEnvironment
+table_env = 
StreamTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_blink_planner().build())
+
+# create a blink batch TableEnvironment
+table_env = 
BatchTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_batch_mode().use_blink_planner().build())
+
+# create a flink streaming TableEnvironment
+table_env = 
StreamTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_old_planner().build())
+
+# create a flink batch TableEnvironment
+table_env = 
BatchTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_batch_mode().use_old_planner().build())
+
+{% endhighlight %}
+
+If you need to access the `ExecutionEnvironment`/`StreamExecutionEnvironment` 
object which the `TableEnvironment` based on,
+e.g. mixing with DataStream API, configuring via the APIs of 
`ExecutionEnvironment`/`StreamExecutionEnvironment`, 
+you can also create a `TableEnvironment` from an 
`ExecutionEnvironment`/`StreamExecutionEnvironment` with a optional 
`TableConfig` object:
+
+{% highlight python %}
+
+from pyflink.dataset import ExecutionEnvironment
+from pyflink.datastream import StreamExecutionEnvironment
+from pyflink.table import StreamTableEnvironment, BatchTableEnvironment, 
TableConfig
+
+# create a blink streaming TableEnvironment from a StreamExecutionEnvironment
+env = StreamExecutionEnvironment.get_execution_environment()
+table_env = StreamTableEnvironment.create(env)
+
+# create a blink streaming TableEnvironment from a StreamExecutionEnvironment 
with a TableConfig
+env = StreamExecutionEnvironment.get_execution_environment()
+table_config = TableConfig()  # you can add configuration options in it
+table_env = StreamTableEnvironment.create(env, table_config)
+
+# create a flink streaming TableEnvironment from a StreamExecutionEnvironment
+env = StreamExecutionEnvironment.get_execution_environment()
+table_env = StreamTableEnvironment.create(env, 
environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_old_planner().build())
+
+# create a flink batch TableEnvironment from an ExecutionEnvironment
+env = ExecutionEnvironment.get_execution_environment()
+table_env = BatchTableEnvironment.create(env)
+
+# create a flink batch TableEnvironment from an ExecutionEnvironment with a 
TableConfig
+env = ExecutionEnvironment.get_execution_environment()
+table_config = TableConfig()  # you can add configuration options in it
+table_env = BatchTableEnvironment.create(env, table_config)
+
+{% endhighlight %}
+
+**Note:** Almost all the configurations in 
`ExecutionEnvironment`/`StreamExecutionEnvironment` can be configured via 
`TableEnvironment.get_config()` now, see [Configuration]({% link ops/config.md 
%}) for more details.
+Only a few rarely used or deprecated configurations still require direct 
access to `ExecutionEnvironment` /`StreamExecutionEnvironment` for configuring, 
e.g. the input dependency constraint.
+
+TableEnvironment API
+--------------------
+
+### Table/SQL Operations
+
+These APIs are used to create/remove Table API/SQL Tables and write queries:
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>from_elements(elements, schema=None, 
verify_schema=True)</strong>
+      </td>
+      <td>
+        Creates a table from a collection of elements. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_elements">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>from_pandas(pdf, schema=None, split_num=1)</strong>
+      </td>
+      <td>
+        Creates a table from a pandas DataFrame. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_pandas">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>from_path(path)</strong>
+      </td>
+      <td>
+        Reads a registered table from catalog and returns the resulting 
`Table` object. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_path">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>sql_query(query)</strong>
+      </td>
+      <td>
+        Evaluates a SQL query on registered tables and retrieves the result as 
a `Table` object. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.sql_query">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_temporary_view(view_path, table)</strong>
+      </td>
+      <td>
+        Registers a `Table` object as a temporary view similar to SQL 
temporary views. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_temporary_view">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>drop_temporary_view(view_path)</strong>
+      </td>
+      <td>
+        Drops a temporary view registered in the given path. 

Review comment:
       ```suggestion
           Drops a temporary view registered under the given path. 
   ```
   
   Pls also check the other places.

##########
File path: docs/dev/python/table-api-users-guide/table_environment.md
##########
@@ -0,0 +1,838 @@
+---
+title: "TableEnvironment"
+nav-parent_id: python_tableapi
+nav-pos: 27
+---
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+This document is an introduction of PyFlink `TableEnvironment`. 
+It includes detailed descriptions of every public interface of the 
`TableEnvironment` class.
+
+* This will be replaced by the TOC
+{:toc}
+
+Create a TableEnvironment
+-------------------------
+
+The recommended way to create a `TableEnvironment` is to create from an 
`EnvironmentSettings` object:
+
+{% highlight python %}
+
+from pyflink.table import EnvironmentSettings, StreamTableEnvironment, 
BatchTableEnvironment
+
+# create a blink streaming TableEnvironment
+table_env = 
StreamTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_blink_planner().build())
+
+# create a blink batch TableEnvironment
+table_env = 
BatchTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_batch_mode().use_blink_planner().build())
+
+# create a flink streaming TableEnvironment
+table_env = 
StreamTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_old_planner().build())
+
+# create a flink batch TableEnvironment
+table_env = 
BatchTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_batch_mode().use_old_planner().build())
+
+{% endhighlight %}
+
+If you need to access the `ExecutionEnvironment`/`StreamExecutionEnvironment` 
object which the `TableEnvironment` based on,
+e.g. mixing with DataStream API, configuring via the APIs of 
`ExecutionEnvironment`/`StreamExecutionEnvironment`, 
+you can also create a `TableEnvironment` from an 
`ExecutionEnvironment`/`StreamExecutionEnvironment` with a optional 
`TableConfig` object:
+
+{% highlight python %}
+
+from pyflink.dataset import ExecutionEnvironment
+from pyflink.datastream import StreamExecutionEnvironment
+from pyflink.table import StreamTableEnvironment, BatchTableEnvironment, 
TableConfig
+
+# create a blink streaming TableEnvironment from a StreamExecutionEnvironment
+env = StreamExecutionEnvironment.get_execution_environment()
+table_env = StreamTableEnvironment.create(env)
+
+# create a blink streaming TableEnvironment from a StreamExecutionEnvironment 
with a TableConfig
+env = StreamExecutionEnvironment.get_execution_environment()
+table_config = TableConfig()  # you can add configuration options in it
+table_env = StreamTableEnvironment.create(env, table_config)
+
+# create a flink streaming TableEnvironment from a StreamExecutionEnvironment
+env = StreamExecutionEnvironment.get_execution_environment()
+table_env = StreamTableEnvironment.create(env, 
environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_old_planner().build())
+
+# create a flink batch TableEnvironment from an ExecutionEnvironment
+env = ExecutionEnvironment.get_execution_environment()
+table_env = BatchTableEnvironment.create(env)
+
+# create a flink batch TableEnvironment from an ExecutionEnvironment with a 
TableConfig
+env = ExecutionEnvironment.get_execution_environment()
+table_config = TableConfig()  # you can add configuration options in it
+table_env = BatchTableEnvironment.create(env, table_config)
+
+{% endhighlight %}
+
+**Note:** Almost all the configurations in 
`ExecutionEnvironment`/`StreamExecutionEnvironment` can be configured via 
`TableEnvironment.get_config()` now, see [Configuration]({% link ops/config.md 
%}) for more details.
+Only a few rarely used or deprecated configurations still require direct 
access to `ExecutionEnvironment` /`StreamExecutionEnvironment` for configuring, 
e.g. the input dependency constraint.
+
+TableEnvironment API
+--------------------
+
+### Table/SQL Operations
+
+These APIs are used to create/remove Table API/SQL Tables and write queries:
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>from_elements(elements, schema=None, 
verify_schema=True)</strong>
+      </td>
+      <td>
+        Creates a table from a collection of elements. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_elements">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>from_pandas(pdf, schema=None, split_num=1)</strong>
+      </td>
+      <td>
+        Creates a table from a pandas DataFrame. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_pandas">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>from_path(path)</strong>
+      </td>
+      <td>
+        Reads a registered table from catalog and returns the resulting 
`Table` object. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_path">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>sql_query(query)</strong>
+      </td>
+      <td>
+        Evaluates a SQL query on registered tables and retrieves the result as 
a `Table` object. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.sql_query">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_temporary_view(view_path, table)</strong>
+      </td>
+      <td>
+        Registers a `Table` object as a temporary view similar to SQL 
temporary views. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_temporary_view">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>drop_temporary_view(view_path)</strong>
+      </td>
+      <td>
+        Drops a temporary view registered in the given path. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.drop_temporary_view">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>drop_temporary_table(table_path)</strong>
+      </td>
+      <td>
+        Drops a temporary table registered in the given path. 
+        You can use this interface to drop the temporary source table and 
temporary sink table.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.drop_temporary_table">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>execute_sql(stmt)</strong>
+      </td>
+      <td>
+        Execute the given single statement, and return the execution result.
+        The statement can be DDL/DML/DQL/SHOW/DESCRIBE/EXPLAIN/USE.
+        Note that for "INSERT INTO" statement this is an async operation.
+        This is usually expected when submitting a job to a remote cluster. 
However, when executing a job in a mini cluster or IDE, you need to wait until 
the job execution finished, then you can refer to the following code: <br>
+{% highlight python %}
+table_env.execute_sql(stmt).get_job_client().get_job_execution_result().result()
+{% endhighlight %}
+        For more details please see the <a href="{{ site.baseurl 
}}/dev/table/sql/">SQL</a> documentation.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.execute_sql">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+<big><strong>Deprecated APIs</strong></big>
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>from_table_source(table_source)</strong>
+      </td>
+      <td>
+        Creates a table from a table source. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_table_source">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>scan(*table_path)</strong>
+      </td>
+      <td>
+        Scans a registered table from catalog and returns the resulting Table.
+        It can be replaced by <strong>from_path</strong>.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.scan">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>register_table(name, table)</strong>
+      </td>
+      <td>
+        Registers a `Table` object under a unique name in the 
TableEnvironment's catalog. 
+        Registered tables can be referenced in SQL queries.
+        It can be replaced by <strong>create_temporary_view</strong>.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.register_table">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>register_table_source(name, table_source)</strong>
+      </td>
+      <td>
+        Registers an external `TableSource` in the TableEnvironment's catalog.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.register_table_source">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>register_table_sink(name, table_sink)</strong>
+      </td>
+      <td>
+        Registers an external `TableSink` in the TableEnvironment's catalog.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.register_table_sink">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>insert_into(target_path, table)</strong>
+      </td>
+      <td>
+        Instructs to write the content of a `Table` object into a sink table.
+        Note that this interface would not trigger the execution of jobs.
+        You need to call the "execute" method to execute your job.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.insert_into">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>sql_update(stmt)</strong>
+      </td>
+      <td>
+        Evaluates a SQL statement such as INSERT, UPDATE or DELETE or a DDL 
statement.
+        It can be replaced by "execute_sql".
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.sql_update">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>connect(connector_descriptor)</strong>
+      </td>
+      <td>
+        Creates a temporary table from a descriptor. 
+        Currently the recommended way is using "execute_sql" to register 
temporary tables.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.connect">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+### Execute/Explain Jobs
+
+These APIs are used to explain/execute jobs. Note that the API `execute_sql` 
can also be used to execute job.
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>explain_sql(stmt, *extra_details)</strong>
+      </td>
+      <td>
+        Returns the AST of the specified statement and the execution plan.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.explain_sql">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_statement_set()</strong>
+      </td>
+      <td>
+        Creates a StatementSet instance which accepts DML statements or Tables.
+        It can be used to execute a multi-sink job. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_statement_set">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+<big><strong>Deprecated APIs</strong></big>
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>explain(table=None, extended=False)</strong>
+      </td>
+      <td>
+        Returns the AST of the specified Table API and SQL queries and the 
execution plan to compute
+        the result of the given `Table` object or multi-sinks plan.
+        If you use the "insert_into" or "sql_update" method to emit data to 
multiple sinks, you can use this
+        method to get the plan.
+        It can be replaced by "explain_sql", `Table`.explain or 
`StatementSet`.explain().
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.explain">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>execute(job_name)</strong>
+      </td>
+      <td>
+        Triggers the program execution. The environment will execute all parts 
of the program.
+        If you use the "insert_into" or "sql_update" method to emit data to 
sinks, you can use this
+        method trigger the program execution.
+        This method will block the client program until the job is 
finished/canceled/failed.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.execute">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+### Create/Drop User Defined Functions
+
+These APIs are used to register UDFs or remove the registered UDFs. 
+Note that the API `execute_sql` can also be used to register/remove UDFs.
+For more introduction about different kinds of UDF, please refer to [User 
Defined Functions]({% link dev/table/functions/index.md %}).
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>create_temporary_function(path, function)</strong>
+      </td>
+      <td>
+        Registers a python user defined function class as a temporary catalog 
function.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_temporary_function">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_temporary_system_function(name, function)</strong>
+      </td>
+      <td>
+        Registers a python user defined function class as a temporary system 
function.
+        If the name of a temporary system function is the same as a temporary 
catalog function,
+        the temporary system function takes precedence.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_temporary_system_function">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_java_function(path, function_class_name, 
ignore_if_exists=None)</strong>
+      </td>
+      <td>
+        Registers a java user defined function class as a catalog function in 
the given path.

Review comment:
       Should we use Java instead of java and Python instead of python 
throughout the doc?

##########
File path: docs/dev/python/table-api-users-guide/table_environment.md
##########
@@ -0,0 +1,838 @@
+---
+title: "TableEnvironment"
+nav-parent_id: python_tableapi
+nav-pos: 27
+---
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+This document is an introduction of PyFlink `TableEnvironment`. 
+It includes detailed descriptions of every public interface of the 
`TableEnvironment` class.
+
+* This will be replaced by the TOC
+{:toc}
+
+Create a TableEnvironment
+-------------------------
+
+The recommended way to create a `TableEnvironment` is to create from an 
`EnvironmentSettings` object:
+
+{% highlight python %}
+
+from pyflink.table import EnvironmentSettings, StreamTableEnvironment, 
BatchTableEnvironment
+
+# create a blink streaming TableEnvironment
+table_env = 
StreamTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_blink_planner().build())
+
+# create a blink batch TableEnvironment
+table_env = 
BatchTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_batch_mode().use_blink_planner().build())
+
+# create a flink streaming TableEnvironment
+table_env = 
StreamTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_old_planner().build())
+
+# create a flink batch TableEnvironment
+table_env = 
BatchTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_batch_mode().use_old_planner().build())
+
+{% endhighlight %}
+
+If you need to access the `ExecutionEnvironment`/`StreamExecutionEnvironment` 
object which the `TableEnvironment` based on,
+e.g. mixing with DataStream API, configuring via the APIs of 
`ExecutionEnvironment`/`StreamExecutionEnvironment`, 
+you can also create a `TableEnvironment` from an 
`ExecutionEnvironment`/`StreamExecutionEnvironment` with a optional 
`TableConfig` object:
+
+{% highlight python %}
+
+from pyflink.dataset import ExecutionEnvironment
+from pyflink.datastream import StreamExecutionEnvironment
+from pyflink.table import StreamTableEnvironment, BatchTableEnvironment, 
TableConfig
+
+# create a blink streaming TableEnvironment from a StreamExecutionEnvironment
+env = StreamExecutionEnvironment.get_execution_environment()
+table_env = StreamTableEnvironment.create(env)
+
+# create a blink streaming TableEnvironment from a StreamExecutionEnvironment 
with a TableConfig
+env = StreamExecutionEnvironment.get_execution_environment()
+table_config = TableConfig()  # you can add configuration options in it
+table_env = StreamTableEnvironment.create(env, table_config)
+
+# create a flink streaming TableEnvironment from a StreamExecutionEnvironment
+env = StreamExecutionEnvironment.get_execution_environment()
+table_env = StreamTableEnvironment.create(env, 
environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_old_planner().build())
+
+# create a flink batch TableEnvironment from an ExecutionEnvironment
+env = ExecutionEnvironment.get_execution_environment()
+table_env = BatchTableEnvironment.create(env)
+
+# create a flink batch TableEnvironment from an ExecutionEnvironment with a 
TableConfig
+env = ExecutionEnvironment.get_execution_environment()
+table_config = TableConfig()  # you can add configuration options in it
+table_env = BatchTableEnvironment.create(env, table_config)
+
+{% endhighlight %}
+
+**Note:** Almost all the configurations in 
`ExecutionEnvironment`/`StreamExecutionEnvironment` can be configured via 
`TableEnvironment.get_config()` now, see [Configuration]({% link ops/config.md 
%}) for more details.
+Only a few rarely used or deprecated configurations still require direct 
access to `ExecutionEnvironment` /`StreamExecutionEnvironment` for configuring, 
e.g. the input dependency constraint.
+
+TableEnvironment API
+--------------------
+
+### Table/SQL Operations
+
+These APIs are used to create/remove Table API/SQL Tables and write queries:
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>from_elements(elements, schema=None, 
verify_schema=True)</strong>
+      </td>
+      <td>
+        Creates a table from a collection of elements. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_elements">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>from_pandas(pdf, schema=None, split_num=1)</strong>
+      </td>
+      <td>
+        Creates a table from a pandas DataFrame. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_pandas">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>from_path(path)</strong>
+      </td>
+      <td>
+        Reads a registered table from catalog and returns the resulting 
`Table` object. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_path">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>sql_query(query)</strong>
+      </td>
+      <td>
+        Evaluates a SQL query on registered tables and retrieves the result as 
a `Table` object. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.sql_query">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_temporary_view(view_path, table)</strong>
+      </td>
+      <td>
+        Registers a `Table` object as a temporary view similar to SQL 
temporary views. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_temporary_view">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>drop_temporary_view(view_path)</strong>
+      </td>
+      <td>
+        Drops a temporary view registered in the given path. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.drop_temporary_view">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>drop_temporary_table(table_path)</strong>
+      </td>
+      <td>
+        Drops a temporary table registered in the given path. 
+        You can use this interface to drop the temporary source table and 
temporary sink table.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.drop_temporary_table">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>execute_sql(stmt)</strong>
+      </td>
+      <td>
+        Execute the given single statement, and return the execution result.
+        The statement can be DDL/DML/DQL/SHOW/DESCRIBE/EXPLAIN/USE.
+        Note that for "INSERT INTO" statement this is an async operation.
+        This is usually expected when submitting a job to a remote cluster. 
However, when executing a job in a mini cluster or IDE, you need to wait until 
the job execution finished, then you can refer to the following code: <br>
+{% highlight python %}
+table_env.execute_sql(stmt).get_job_client().get_job_execution_result().result()
+{% endhighlight %}
+        For more details please see the <a href="{{ site.baseurl 
}}/dev/table/sql/">SQL</a> documentation.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.execute_sql">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+<big><strong>Deprecated APIs</strong></big>
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>from_table_source(table_source)</strong>
+      </td>
+      <td>
+        Creates a table from a table source. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_table_source">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>scan(*table_path)</strong>
+      </td>
+      <td>
+        Scans a registered table from catalog and returns the resulting Table.
+        It can be replaced by <strong>from_path</strong>.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.scan">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>register_table(name, table)</strong>
+      </td>
+      <td>
+        Registers a `Table` object under a unique name in the 
TableEnvironment's catalog. 
+        Registered tables can be referenced in SQL queries.
+        It can be replaced by <strong>create_temporary_view</strong>.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.register_table">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>register_table_source(name, table_source)</strong>
+      </td>
+      <td>
+        Registers an external `TableSource` in the TableEnvironment's catalog.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.register_table_source">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>register_table_sink(name, table_sink)</strong>
+      </td>
+      <td>
+        Registers an external `TableSink` in the TableEnvironment's catalog.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.register_table_sink">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>insert_into(target_path, table)</strong>
+      </td>
+      <td>
+        Instructs to write the content of a `Table` object into a sink table.
+        Note that this interface would not trigger the execution of jobs.
+        You need to call the "execute" method to execute your job.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.insert_into">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>sql_update(stmt)</strong>
+      </td>
+      <td>
+        Evaluates a SQL statement such as INSERT, UPDATE or DELETE or a DDL 
statement.
+        It can be replaced by "execute_sql".
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.sql_update">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>connect(connector_descriptor)</strong>
+      </td>
+      <td>
+        Creates a temporary table from a descriptor. 
+        Currently the recommended way is using "execute_sql" to register 
temporary tables.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.connect">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+### Execute/Explain Jobs
+
+These APIs are used to explain/execute jobs. Note that the API `execute_sql` 
can also be used to execute job.
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>explain_sql(stmt, *extra_details)</strong>
+      </td>
+      <td>
+        Returns the AST of the specified statement and the execution plan.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.explain_sql">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_statement_set()</strong>
+      </td>
+      <td>
+        Creates a StatementSet instance which accepts DML statements or Tables.
+        It can be used to execute a multi-sink job. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_statement_set">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+<big><strong>Deprecated APIs</strong></big>
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>explain(table=None, extended=False)</strong>
+      </td>
+      <td>
+        Returns the AST of the specified Table API and SQL queries and the 
execution plan to compute
+        the result of the given `Table` object or multi-sinks plan.
+        If you use the "insert_into" or "sql_update" method to emit data to 
multiple sinks, you can use this
+        method to get the plan.
+        It can be replaced by "explain_sql", `Table`.explain or 
`StatementSet`.explain().
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.explain">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>execute(job_name)</strong>
+      </td>
+      <td>
+        Triggers the program execution. The environment will execute all parts 
of the program.
+        If you use the "insert_into" or "sql_update" method to emit data to 
sinks, you can use this
+        method trigger the program execution.
+        This method will block the client program until the job is 
finished/canceled/failed.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.execute">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+### Create/Drop User Defined Functions
+
+These APIs are used to register UDFs or remove the registered UDFs. 
+Note that the API `execute_sql` can also be used to register/remove UDFs.
+For more introduction about different kinds of UDF, please refer to [User 
Defined Functions]({% link dev/table/functions/index.md %}).

Review comment:
       ```suggestion
   For more details about the different kinds of UDF, please refer to [User 
Defined Functions]({% link dev/table/functions/index.md %}).
   ```

##########
File path: docs/dev/python/table-api-users-guide/table_environment.md
##########
@@ -0,0 +1,838 @@
+---
+title: "TableEnvironment"
+nav-parent_id: python_tableapi
+nav-pos: 27
+---
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+This document is an introduction of PyFlink `TableEnvironment`. 
+It includes detailed descriptions of every public interface of the 
`TableEnvironment` class.
+
+* This will be replaced by the TOC
+{:toc}
+
+Create a TableEnvironment
+-------------------------
+
+The recommended way to create a `TableEnvironment` is to create from an 
`EnvironmentSettings` object:
+
+{% highlight python %}
+
+from pyflink.table import EnvironmentSettings, StreamTableEnvironment, 
BatchTableEnvironment
+
+# create a blink streaming TableEnvironment
+table_env = 
StreamTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_blink_planner().build())
+
+# create a blink batch TableEnvironment
+table_env = 
BatchTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_batch_mode().use_blink_planner().build())
+
+# create a flink streaming TableEnvironment
+table_env = 
StreamTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_old_planner().build())
+
+# create a flink batch TableEnvironment
+table_env = 
BatchTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_batch_mode().use_old_planner().build())
+
+{% endhighlight %}
+
+If you need to access the `ExecutionEnvironment`/`StreamExecutionEnvironment` 
object which the `TableEnvironment` based on,
+e.g. mixing with DataStream API, configuring via the APIs of 
`ExecutionEnvironment`/`StreamExecutionEnvironment`, 
+you can also create a `TableEnvironment` from an 
`ExecutionEnvironment`/`StreamExecutionEnvironment` with a optional 
`TableConfig` object:
+
+{% highlight python %}
+
+from pyflink.dataset import ExecutionEnvironment
+from pyflink.datastream import StreamExecutionEnvironment
+from pyflink.table import StreamTableEnvironment, BatchTableEnvironment, 
TableConfig
+
+# create a blink streaming TableEnvironment from a StreamExecutionEnvironment
+env = StreamExecutionEnvironment.get_execution_environment()
+table_env = StreamTableEnvironment.create(env)
+
+# create a blink streaming TableEnvironment from a StreamExecutionEnvironment 
with a TableConfig
+env = StreamExecutionEnvironment.get_execution_environment()
+table_config = TableConfig()  # you can add configuration options in it
+table_env = StreamTableEnvironment.create(env, table_config)
+
+# create a flink streaming TableEnvironment from a StreamExecutionEnvironment
+env = StreamExecutionEnvironment.get_execution_environment()
+table_env = StreamTableEnvironment.create(env, 
environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_old_planner().build())
+
+# create a flink batch TableEnvironment from an ExecutionEnvironment
+env = ExecutionEnvironment.get_execution_environment()
+table_env = BatchTableEnvironment.create(env)
+
+# create a flink batch TableEnvironment from an ExecutionEnvironment with a 
TableConfig
+env = ExecutionEnvironment.get_execution_environment()
+table_config = TableConfig()  # you can add configuration options in it
+table_env = BatchTableEnvironment.create(env, table_config)
+
+{% endhighlight %}
+
+**Note:** Almost all the configurations in 
`ExecutionEnvironment`/`StreamExecutionEnvironment` can be configured via 
`TableEnvironment.get_config()` now, see [Configuration]({% link ops/config.md 
%}) for more details.
+Only a few rarely used or deprecated configurations still require direct 
access to `ExecutionEnvironment` /`StreamExecutionEnvironment` for configuring, 
e.g. the input dependency constraint.
+
+TableEnvironment API
+--------------------
+
+### Table/SQL Operations
+
+These APIs are used to create/remove Table API/SQL Tables and write queries:
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>from_elements(elements, schema=None, 
verify_schema=True)</strong>
+      </td>
+      <td>
+        Creates a table from a collection of elements. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_elements">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>from_pandas(pdf, schema=None, split_num=1)</strong>
+      </td>
+      <td>
+        Creates a table from a pandas DataFrame. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_pandas">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>from_path(path)</strong>
+      </td>
+      <td>
+        Reads a registered table from catalog and returns the resulting 
`Table` object. 

Review comment:
       ```suggestion
           Creates a table from a registered table under the specified path, 
e.g. tables registered via `create_temporary_view`
   ```

##########
File path: docs/dev/python/table-api-users-guide/table_environment.md
##########
@@ -0,0 +1,838 @@
+---
+title: "TableEnvironment"
+nav-parent_id: python_tableapi
+nav-pos: 27
+---
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+This document is an introduction of PyFlink `TableEnvironment`. 
+It includes detailed descriptions of every public interface of the 
`TableEnvironment` class.
+
+* This will be replaced by the TOC
+{:toc}
+
+Create a TableEnvironment
+-------------------------
+
+The recommended way to create a `TableEnvironment` is to create from an 
`EnvironmentSettings` object:
+
+{% highlight python %}
+
+from pyflink.table import EnvironmentSettings, StreamTableEnvironment, 
BatchTableEnvironment
+
+# create a blink streaming TableEnvironment
+table_env = 
StreamTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_blink_planner().build())
+
+# create a blink batch TableEnvironment
+table_env = 
BatchTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_batch_mode().use_blink_planner().build())
+
+# create a flink streaming TableEnvironment
+table_env = 
StreamTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_old_planner().build())
+
+# create a flink batch TableEnvironment
+table_env = 
BatchTableEnvironment.create(environment_settings=EnvironmentSettings.new_instance().in_batch_mode().use_old_planner().build())
+
+{% endhighlight %}
+
+If you need to access the `ExecutionEnvironment`/`StreamExecutionEnvironment` 
object which the `TableEnvironment` based on,
+e.g. mixing with DataStream API, configuring via the APIs of 
`ExecutionEnvironment`/`StreamExecutionEnvironment`, 
+you can also create a `TableEnvironment` from an 
`ExecutionEnvironment`/`StreamExecutionEnvironment` with a optional 
`TableConfig` object:
+
+{% highlight python %}
+
+from pyflink.dataset import ExecutionEnvironment
+from pyflink.datastream import StreamExecutionEnvironment
+from pyflink.table import StreamTableEnvironment, BatchTableEnvironment, 
TableConfig
+
+# create a blink streaming TableEnvironment from a StreamExecutionEnvironment
+env = StreamExecutionEnvironment.get_execution_environment()
+table_env = StreamTableEnvironment.create(env)
+
+# create a blink streaming TableEnvironment from a StreamExecutionEnvironment 
with a TableConfig
+env = StreamExecutionEnvironment.get_execution_environment()
+table_config = TableConfig()  # you can add configuration options in it
+table_env = StreamTableEnvironment.create(env, table_config)
+
+# create a flink streaming TableEnvironment from a StreamExecutionEnvironment
+env = StreamExecutionEnvironment.get_execution_environment()
+table_env = StreamTableEnvironment.create(env, 
environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_old_planner().build())
+
+# create a flink batch TableEnvironment from an ExecutionEnvironment
+env = ExecutionEnvironment.get_execution_environment()
+table_env = BatchTableEnvironment.create(env)
+
+# create a flink batch TableEnvironment from an ExecutionEnvironment with a 
TableConfig
+env = ExecutionEnvironment.get_execution_environment()
+table_config = TableConfig()  # you can add configuration options in it
+table_env = BatchTableEnvironment.create(env, table_config)
+
+{% endhighlight %}
+
+**Note:** Almost all the configurations in 
`ExecutionEnvironment`/`StreamExecutionEnvironment` can be configured via 
`TableEnvironment.get_config()` now, see [Configuration]({% link ops/config.md 
%}) for more details.
+Only a few rarely used or deprecated configurations still require direct 
access to `ExecutionEnvironment` /`StreamExecutionEnvironment` for configuring, 
e.g. the input dependency constraint.
+
+TableEnvironment API
+--------------------
+
+### Table/SQL Operations
+
+These APIs are used to create/remove Table API/SQL Tables and write queries:
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>from_elements(elements, schema=None, 
verify_schema=True)</strong>
+      </td>
+      <td>
+        Creates a table from a collection of elements. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_elements">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>from_pandas(pdf, schema=None, split_num=1)</strong>
+      </td>
+      <td>
+        Creates a table from a pandas DataFrame. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_pandas">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>from_path(path)</strong>
+      </td>
+      <td>
+        Reads a registered table from catalog and returns the resulting 
`Table` object. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_path">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>sql_query(query)</strong>
+      </td>
+      <td>
+        Evaluates a SQL query on registered tables and retrieves the result as 
a `Table` object. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.sql_query">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_temporary_view(view_path, table)</strong>
+      </td>
+      <td>
+        Registers a `Table` object as a temporary view similar to SQL 
temporary views. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_temporary_view">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>drop_temporary_view(view_path)</strong>
+      </td>
+      <td>
+        Drops a temporary view registered in the given path. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.drop_temporary_view">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>drop_temporary_table(table_path)</strong>
+      </td>
+      <td>
+        Drops a temporary table registered in the given path. 
+        You can use this interface to drop the temporary source table and 
temporary sink table.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.drop_temporary_table">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>execute_sql(stmt)</strong>
+      </td>
+      <td>
+        Execute the given single statement, and return the execution result.
+        The statement can be DDL/DML/DQL/SHOW/DESCRIBE/EXPLAIN/USE.
+        Note that for "INSERT INTO" statement this is an async operation.
+        This is usually expected when submitting a job to a remote cluster. 
However, when executing a job in a mini cluster or IDE, you need to wait until 
the job execution finished, then you can refer to the following code: <br>
+{% highlight python %}
+table_env.execute_sql(stmt).get_job_client().get_job_execution_result().result()
+{% endhighlight %}
+        For more details please see the <a href="{{ site.baseurl 
}}/dev/table/sql/">SQL</a> documentation.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.execute_sql">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+<big><strong>Deprecated APIs</strong></big>
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>from_table_source(table_source)</strong>
+      </td>
+      <td>
+        Creates a table from a table source. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.from_table_source">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>scan(*table_path)</strong>
+      </td>
+      <td>
+        Scans a registered table from catalog and returns the resulting Table.
+        It can be replaced by <strong>from_path</strong>.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.scan">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>register_table(name, table)</strong>
+      </td>
+      <td>
+        Registers a `Table` object under a unique name in the 
TableEnvironment's catalog. 
+        Registered tables can be referenced in SQL queries.
+        It can be replaced by <strong>create_temporary_view</strong>.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.register_table">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>register_table_source(name, table_source)</strong>
+      </td>
+      <td>
+        Registers an external `TableSource` in the TableEnvironment's catalog.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.register_table_source">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>register_table_sink(name, table_sink)</strong>
+      </td>
+      <td>
+        Registers an external `TableSink` in the TableEnvironment's catalog.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.register_table_sink">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>insert_into(target_path, table)</strong>
+      </td>
+      <td>
+        Instructs to write the content of a `Table` object into a sink table.
+        Note that this interface would not trigger the execution of jobs.
+        You need to call the "execute" method to execute your job.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.insert_into">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>sql_update(stmt)</strong>
+      </td>
+      <td>
+        Evaluates a SQL statement such as INSERT, UPDATE or DELETE or a DDL 
statement.
+        It can be replaced by "execute_sql".
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.sql_update">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>connect(connector_descriptor)</strong>
+      </td>
+      <td>
+        Creates a temporary table from a descriptor. 
+        Currently the recommended way is using "execute_sql" to register 
temporary tables.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.connect">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+### Execute/Explain Jobs
+
+These APIs are used to explain/execute jobs. Note that the API `execute_sql` 
can also be used to execute job.
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>explain_sql(stmt, *extra_details)</strong>
+      </td>
+      <td>
+        Returns the AST of the specified statement and the execution plan.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.explain_sql">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_statement_set()</strong>
+      </td>
+      <td>
+        Creates a StatementSet instance which accepts DML statements or Tables.
+        It can be used to execute a multi-sink job. 
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_statement_set">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+<big><strong>Deprecated APIs</strong></big>
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>explain(table=None, extended=False)</strong>
+      </td>
+      <td>
+        Returns the AST of the specified Table API and SQL queries and the 
execution plan to compute
+        the result of the given `Table` object or multi-sinks plan.
+        If you use the "insert_into" or "sql_update" method to emit data to 
multiple sinks, you can use this
+        method to get the plan.
+        It can be replaced by "explain_sql", `Table`.explain or 
`StatementSet`.explain().
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.explain">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>execute(job_name)</strong>
+      </td>
+      <td>
+        Triggers the program execution. The environment will execute all parts 
of the program.
+        If you use the "insert_into" or "sql_update" method to emit data to 
sinks, you can use this
+        method trigger the program execution.
+        This method will block the client program until the job is 
finished/canceled/failed.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.execute">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+### Create/Drop User Defined Functions
+
+These APIs are used to register UDFs or remove the registered UDFs. 
+Note that the API `execute_sql` can also be used to register/remove UDFs.
+For more introduction about different kinds of UDF, please refer to [User 
Defined Functions]({% link dev/table/functions/index.md %}).
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>create_temporary_function(path, function)</strong>
+      </td>
+      <td>
+        Registers a python user defined function class as a temporary catalog 
function.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_temporary_function">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_temporary_system_function(name, function)</strong>
+      </td>
+      <td>
+        Registers a python user defined function class as a temporary system 
function.
+        If the name of a temporary system function is the same as a temporary 
catalog function,
+        the temporary system function takes precedence.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_temporary_system_function">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_java_function(path, function_class_name, 
ignore_if_exists=None)</strong>
+      </td>
+      <td>
+        Registers a java user defined function class as a catalog function in 
the given path.
+        If the catalog is persistent, the register catalog function can be 
used across multiple Flink sessions and clusters.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_java_function">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_java_temporary_function(path, 
function_class_name)</strong>
+      </td>
+      <td>
+        Registers a java user defined function class as a temporary catalog 
function.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_java_temporary_function">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>create_java_temporary_system_function(name, 
function_class_name)</strong>
+      </td>
+      <td>
+        Registers a java user defined function class as a temporary system 
function.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.create_java_temporary_system_function">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>drop_function(path)</strong>
+      </td>
+      <td>
+        Drops a catalog function registered in the given path.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.drop_function">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>drop_temporary_function(path)</strong>
+      </td>
+      <td>
+        Drops a temporary system function registered under the given name.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.drop_temporary_function">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>drop_temporary_system_function(name)</strong>
+      </td>
+      <td>
+        Drops a temporary system function registered under the given name.
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.drop_temporary_system_function">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+<big><strong>Deprecated APIs</strong></big>
+
+<table class="table table-bordered">
+  <thead>
+    <tr>
+      <th class="text-left" style="width: 20%">APIs</th>
+      <th class="text-center">Description</th>
+      <th class="text-center" style="width: 10%">Docs</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>
+        <strong>register_function(name, function)</strong>
+      </td>
+      <td>
+        Registers a python user-defined function under a unique name. 
+        Replaces already existing user-defined function under this name.
+        It can be replaced by "create_temporary_system_function".
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.register_function">link</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <strong>register_java_function(name, function_class_name)</strong>
+      </td>
+      <td>
+        Registers a java user defined function under a unique name. 
+        Replaces already existing user-defined functions under this name.
+        It can be replaced by "create_java_temporary_system_function".
+      </td>
+      <td class="text-center">
+        <a href="{{ site.pythondocs_baseurl 
}}/api/python/pyflink.table.html#pyflink.table.TableEnvironment.register_java_function">link</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+### Dependency Management
+
+These APIs are used to upload the python dependencies which are necessary for 
running the Python UDFs remotely.
+For more details please see the [Dependency Management]({% link 
dev/python/table-api-users-guide/dependency_management.md %}#python-dependency) 
document.

Review comment:
       ```suggestion
   For more details, please see the [Dependency Management]({% link 
dev/python/table-api-users-guide/dependency_management.md %}#python-dependency) 
document.
   ```




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to