Skip to content

Commit 566b8a1

Browse files
update 0421
1 parent 6add773 commit 566b8a1

File tree

20 files changed

+10310
-18
lines changed

20 files changed

+10310
-18
lines changed

docs/book/chapter12-05-02-UDF.html

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ <h3><a class="header" href="#udf" id="udf">UDF</a></h3>
163163
<p>用户定义函数(User-defined Functions,UDF)是一个重要的特性,因为它们显著地扩展了查询(Query)的表达能力。一些系统内置函数无法解决的需求,我们可以用UDF来自定义实现。</p>
164164
<h4><a class="header" href="#注册用户自定义函数udf" id="注册用户自定义函数udf">注册用户自定义函数UDF</a></h4>
165165
<p>在大多数情况下,用户定义的函数必须先注册,然后才能在查询中使用。不需要专门为Scala 的Table API注册函数。</p>
166-
<p>函数通过调用registerFunction()方法在TableEnvironment中注册。当用户定义的函数被注册时,它被插入到TableEnvironment的函数目录中,这样Table API或SQL解析器就可以识别并正确地解释它。</p>
166+
<p>函数通过调用registerFunction()方法在TableEnvironment中注册。当用户定义的函数被注册时,它被插入到TableEnvironment的函数目录中,这样Table API或SQL解析器就可以识别并正确地解释它。</p>
167167
<h4><a class="header" href="#标量函数scalar-functions" id="标量函数scalar-functions">标量函数(Scalar Functions)</a></h4>
168168
<p>用户定义的标量函数,可以将0、1或多个标量值,映射到新的标量值。</p>
169169
<p>为了定义标量函数,必须在org.apache.flink.table.functions中扩展基类Scalar Function,并实现(一个或多个)求值(evaluation,eval)方法。标量函数的行为由求值方法决定,求值方法必须公开声明并命名为eval(直接def声明,没有override)。求值方法的参数类型和返回类型,确定了标量函数的参数和返回类型。</p>
@@ -247,7 +247,7 @@ <h4><a class="header" href="#标量函数scalar-functions" id="标量函数scala
247247
<h4><a class="header" href="#表函数table-functions" id="表函数table-functions">表函数(Table Functions)</a></h4>
248248
<p>与用户定义的标量函数类似,用户定义的表函数,可以将0、1或多个标量值作为输入参数;与标量函数不同的是,它可以返回任意数量的行作为输出,而不是单个值。</p>
249249
<p>为了定义一个表函数,必须扩展org.apache.flink.table.functions中的基类TableFunction并实现(一个或多个)求值方法。表函数的行为由其求值方法决定,求值方法必须是public的,并命名为eval。求值方法的参数类型,决定表函数的所有有效参数。</p>
250-
<p>返回表的类型由TableFunction的泛型类型确定。求值方法使用protected collect(T)方法发出输出行。</p>
250+
<p>返回表的类型由TableFunction的泛型类型确定。求值方法使用protected collect(T)方法发出输出行。</p>
251251
<p>在Table API中,Table函数需要与.joinLateral或.leftOuterJoinLateral一起使用。</p>
252252
<p>joinLateral算子,会将外部表中的每一行,与表函数(TableFunction,算子的参数是它的表达式)计算得到的所有行连接起来。</p>
253253
<p>而leftOuterJoinLateral算子,则是左外连接,它同样会将外部表中的每一行与表函数计算生成的所有行连接起来;并且,对于表函数返回的是空表的外部行,也要保留下来。</p>
@@ -339,20 +339,20 @@ <h4><a class="header" href="#聚合函数aggregate-functions" id="聚合函数ag
339339
<p>假设现在有一张表,包含了各种饮料的数据。该表由三列(id、name和price)、五行组成数据。现在我们需要找到表中所有饮料的最高价格,即执行max()聚合,结果将是一个数值。</p>
340340
<p>AggregateFunction的工作原理如下。</p>
341341
<ul>
342-
<li>首先,它需要一个累加器,用来保存聚合中间结果的数据结构(状态)。可以通过调用AggregateFunction的createAccumulator()方法创建空累加器。</li>
343-
<li>随后,对每个输入行调用函数的accumulate()方法来更新累加器。</li>
344-
<li>处理完所有行后,将调用函数的getValue()方法来计算并返回最终结果。</li>
342+
<li>首先,它需要一个累加器,用来保存聚合中间结果的数据结构(状态)。可以通过调用AggregateFunction的createAccumulator()方法创建空累加器。</li>
343+
<li>随后,对每个输入行调用函数的accumulate()方法来更新累加器。</li>
344+
<li>处理完所有行后,将调用函数的getValue()方法来计算并返回最终结果。</li>
345345
</ul>
346346
<p>AggregationFunction要求必须实现的方法:</p>
347347
<ul>
348348
<li>createAccumulator()</li>
349349
<li>accumulate()</li>
350350
<li>getValue()</li>
351351
</ul>
352-
<p>除了上述方法之外,还有一些可选择实现的方法。其中一些方法,可以让系统执行查询更有效率,而另一些方法,对于某些场景是必需的。例如,如果聚合函数应用在会话窗口(session group window)的上下文中,则merge()方法是必需的。</p>
352+
<p>除了上述方法之外,还有一些可选择实现的方法。其中一些方法,可以让系统执行查询更有效率,而另一些方法,对于某些场景是必需的。例如,如果聚合函数应用在会话窗口(session group window)的上下文中,则merge()方法是必需的。</p>
353353
<ul>
354-
<li>retract() </li>
355-
<li>merge() </li>
354+
<li>retract()</li>
355+
<li>merge()</li>
356356
<li>resetAccumulator()</li>
357357
</ul>
358358
<p>接下来我们写一个自定义AggregateFunction,计算一下每个sensor的平均温度值。</p>

docs/book/chapter13-09-00-实时对帐:实现两条流的Join.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ <h1 class="menu-title">尚硅谷Flink教程</h1>
161161
<main>
162162
<h2><a class="header" href="#实时对帐实现两条流的join" id="实时对帐实现两条流的join">实时对帐:实现两条流的Join</a></h2>
163163
<p>完整代码如下:</p>
164+
<p><strong>scala version</strong></p>
164165
<pre><code class="language-scala">object TwoStreamJoin {
165166

166167
case class OrderEvent(orderId: String, eventType: String, eventTime: Long)

docs/book/print.html

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5563,7 +5563,7 @@ <h3><a class="header" href="#udf" id="udf">UDF</a></h3>
55635563
<p>用户定义函数(User-defined Functions,UDF)是一个重要的特性,因为它们显著地扩展了查询(Query)的表达能力。一些系统内置函数无法解决的需求,我们可以用UDF来自定义实现。</p>
55645564
<h4><a class="header" href="#注册用户自定义函数udf" id="注册用户自定义函数udf">注册用户自定义函数UDF</a></h4>
55655565
<p>在大多数情况下,用户定义的函数必须先注册,然后才能在查询中使用。不需要专门为Scala 的Table API注册函数。</p>
5566-
<p>函数通过调用registerFunction()方法在TableEnvironment中注册。当用户定义的函数被注册时,它被插入到TableEnvironment的函数目录中,这样Table API或SQL解析器就可以识别并正确地解释它。</p>
5566+
<p>函数通过调用registerFunction()方法在TableEnvironment中注册。当用户定义的函数被注册时,它被插入到TableEnvironment的函数目录中,这样Table API或SQL解析器就可以识别并正确地解释它。</p>
55675567
<h4><a class="header" href="#标量函数scalar-functions" id="标量函数scalar-functions">标量函数(Scalar Functions)</a></h4>
55685568
<p>用户定义的标量函数,可以将0、1或多个标量值,映射到新的标量值。</p>
55695569
<p>为了定义标量函数,必须在org.apache.flink.table.functions中扩展基类Scalar Function,并实现(一个或多个)求值(evaluation,eval)方法。标量函数的行为由求值方法决定,求值方法必须公开声明并命名为eval(直接def声明,没有override)。求值方法的参数类型和返回类型,确定了标量函数的参数和返回类型。</p>
@@ -5647,7 +5647,7 @@ <h4><a class="header" href="#标量函数scalar-functions" id="标量函数scala
56475647
<h4><a class="header" href="#表函数table-functions" id="表函数table-functions">表函数(Table Functions)</a></h4>
56485648
<p>与用户定义的标量函数类似,用户定义的表函数,可以将0、1或多个标量值作为输入参数;与标量函数不同的是,它可以返回任意数量的行作为输出,而不是单个值。</p>
56495649
<p>为了定义一个表函数,必须扩展org.apache.flink.table.functions中的基类TableFunction并实现(一个或多个)求值方法。表函数的行为由其求值方法决定,求值方法必须是public的,并命名为eval。求值方法的参数类型,决定表函数的所有有效参数。</p>
5650-
<p>返回表的类型由TableFunction的泛型类型确定。求值方法使用protected collect(T)方法发出输出行。</p>
5650+
<p>返回表的类型由TableFunction的泛型类型确定。求值方法使用protected collect(T)方法发出输出行。</p>
56515651
<p>在Table API中,Table函数需要与.joinLateral或.leftOuterJoinLateral一起使用。</p>
56525652
<p>joinLateral算子,会将外部表中的每一行,与表函数(TableFunction,算子的参数是它的表达式)计算得到的所有行连接起来。</p>
56535653
<p>而leftOuterJoinLateral算子,则是左外连接,它同样会将外部表中的每一行与表函数计算生成的所有行连接起来;并且,对于表函数返回的是空表的外部行,也要保留下来。</p>
@@ -5739,20 +5739,20 @@ <h4><a class="header" href="#聚合函数aggregate-functions" id="聚合函数ag
57395739
<p>假设现在有一张表,包含了各种饮料的数据。该表由三列(id、name和price)、五行组成数据。现在我们需要找到表中所有饮料的最高价格,即执行max()聚合,结果将是一个数值。</p>
57405740
<p>AggregateFunction的工作原理如下。</p>
57415741
<ul>
5742-
<li>首先,它需要一个累加器,用来保存聚合中间结果的数据结构(状态)。可以通过调用AggregateFunction的createAccumulator()方法创建空累加器。</li>
5743-
<li>随后,对每个输入行调用函数的accumulate()方法来更新累加器。</li>
5744-
<li>处理完所有行后,将调用函数的getValue()方法来计算并返回最终结果。</li>
5742+
<li>首先,它需要一个累加器,用来保存聚合中间结果的数据结构(状态)。可以通过调用AggregateFunction的createAccumulator()方法创建空累加器。</li>
5743+
<li>随后,对每个输入行调用函数的accumulate()方法来更新累加器。</li>
5744+
<li>处理完所有行后,将调用函数的getValue()方法来计算并返回最终结果。</li>
57455745
</ul>
57465746
<p>AggregationFunction要求必须实现的方法:</p>
57475747
<ul>
57485748
<li>createAccumulator()</li>
57495749
<li>accumulate()</li>
57505750
<li>getValue()</li>
57515751
</ul>
5752-
<p>除了上述方法之外,还有一些可选择实现的方法。其中一些方法,可以让系统执行查询更有效率,而另一些方法,对于某些场景是必需的。例如,如果聚合函数应用在会话窗口(session group window)的上下文中,则merge()方法是必需的。</p>
5752+
<p>除了上述方法之外,还有一些可选择实现的方法。其中一些方法,可以让系统执行查询更有效率,而另一些方法,对于某些场景是必需的。例如,如果聚合函数应用在会话窗口(session group window)的上下文中,则merge()方法是必需的。</p>
57535753
<ul>
5754-
<li>retract() </li>
5755-
<li>merge() </li>
5754+
<li>retract()</li>
5755+
<li>merge()</li>
57565756
<li>resetAccumulator()</li>
57575757
</ul>
57585758
<p>接下来我们写一个自定义AggregateFunction,计算一下每个sensor的平均温度值。</p>
@@ -6923,6 +6923,7 @@ <h3><a class="header" href="#使用process-function实现订单超时需求" id=
69236923
</code></pre>
69246924
<h2><a class="header" href="#实时对帐实现两条流的join" id="实时对帐实现两条流的join">实时对帐:实现两条流的Join</a></h2>
69256925
<p>完整代码如下:</p>
6926+
<p><strong>scala version</strong></p>
69266927
<pre><code class="language-scala">object TwoStreamJoin {
69276928

69286929
case class OrderEvent(orderId: String, eventType: String, eventTime: Long)

docs/book/searchindex.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/book/searchindex.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)