日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用flink Table Sql api来构建批量和流式应用(2)Table API概述

發布時間:2025/4/5 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用flink Table Sql api来构建批量和流式应用(2)Table API概述 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

從flink的官方文檔,我們知道flink的編程模型分為四層,sql層是最高層的api,Table api是中間層,DataStream/DataSet Api 是核心,stateful Streaming process層是底層實現。

?

?

?

其中,

flink dataset api使用及原理?介紹了DataSet Api?

flink DataStream API使用及原理介紹了DataStream?Api?

flink中的時間戳如何使用?---Watermark使用及原理?介紹了底層實現的基礎Watermark

flink window實例分析?介紹了window的概念及使用原理

Flink中的狀態與容錯?介紹了State的概念及checkpoint,savepoint的容錯機制

?上篇<使用flink Table &Sql api來構建批量和流式應用(1)Table的基本概念>介紹了Table的基本概念及使用方法

本篇主要看看Table Api有哪些功能?

org.apache.flink.table.api.Table抽象了Table Api的功能

/*** A Table is the core component of the Table API.* Similar to how the batch and streaming APIs have DataSet and DataStream,* the Table API is built around {@link Table}.** <p>Use the methods of {@link Table} to transform data. Use {@code TableEnvironment} to convert a* {@link Table} back to a {@code DataSet} or {@code DataStream}.** <p>When using Scala a {@link Table} can also be converted using implicit conversions.** <p>Java Example:** <pre>* {@code* ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();* BatchTableEnvironment tEnv = BatchTableEnvironment.create(env);** DataSet<Tuple2<String, Integer>> set = ...* tEnv.registerTable("MyTable", set, "a, b");** Table table = tEnv.scan("MyTable").select(...);* ...* Table table2 = ...* DataSet<MyType> set2 = tEnv.toDataSet(table2, MyType.class);* }* </pre>** <p>Scala Example:** <pre>* {@code* val env = ExecutionEnvironment.getExecutionEnvironment* val tEnv = BatchTableEnvironment.create(env)** val set: DataSet[(String, Int)] = ...* val table = set.toTable(tEnv, 'a, 'b)* ...* val table2 = ...* val set2: DataSet[MyType] = table2.toDataSet[MyType]* }* </pre>** <p>Operations such as {@code join}, {@code select}, {@code where} and {@code groupBy} either* take arguments in a Scala DSL or as an expression String. Please refer to the documentation for* the expression syntax.*/

(1) 查詢select?

/*** Performs a selection operation. Similar to a SQL SELECT statement. The field expressions* can contain complex expressions and aggregations.** <p>Example:** <pre>* {@code* tab.select("key, value.avg + ' The average' as average")* }* </pre>*/Table select(String fields);/*** Performs a selection operation. Similar to a SQL SELECT statement. The field expressions* can contain complex expressions and aggregations.** <p>Scala Example:** <pre>* {@code* tab.select('key, 'value.avg + " The average" as 'average)* }* </pre>*/Table select(Expression... fields);

(2) 條件where?

/*** Filters out elements that don't pass the filter predicate. Similar to a SQL WHERE* clause.** <p>Example:** <pre>* {@code* tab.where("name = 'Fred'")* }* </pre>*/Table where(String predicate);/*** Filters out elements that don't pass the filter predicate. Similar to a SQL WHERE* clause.** <p>Scala Example:** <pre>* {@code* tab.where('name === "Fred")* }* </pre>*/Table where(Expression predicate);

(3)過濾Filter

/*** Filters out elements that don't pass the filter predicate. Similar to a SQL WHERE* clause.** <p>Example:** <pre>* {@code* tab.filter("name = 'Fred'")* }* </pre>*/Table filter(String predicate);/*** Filters out elements that don't pass the filter predicate. Similar to a SQL WHERE* clause.** <p>Scala Example:** <pre>* {@code* tab.filter('name === "Fred")* }* </pre>*/Table filter(Expression predicate);

(4) distinct

/*** Removes duplicate values and returns only distinct (different) values.** <p>Example:** <pre>* {@code* tab.select("key, value").distinct()* }* </pre>*/Table distinct();

(5) group by?

/*** Groups the elements on some grouping keys. Use this before a selection with aggregations* to perform the aggregation on a per-group basis. Similar to a SQL GROUP BY statement.** <p>Example:** <pre>* {@code* tab.groupBy("key").select("key, value.avg")* }* </pre>*/GroupedTable groupBy(String fields);/*** Groups the elements on some grouping keys. Use this before a selection with aggregations* to perform the aggregation on a per-group basis. Similar to a SQL GROUP BY statement.** <p>Scala Example:** <pre>* {@code* tab.groupBy('key).select('key, 'value.avg)* }* </pre>*/GroupedTable groupBy(Expression... fields);

(6) order by

/*** Sorts the given {@link Table}. Similar to SQL ORDER BY.* The resulting Table is sorted globally sorted across all parallel partitions.** <p>Example:** <pre>* {@code* tab.orderBy("name.desc")* }* </pre>*/Table orderBy(String fields);/*** Sorts the given {@link Table}. Similar to SQL ORDER BY.* The resulting Table is globally sorted across all parallel partitions.** <p>Scala Example:** <pre>* {@code* tab.orderBy('name.desc)* }* </pre>*/Table orderBy(Expression... fields);

(7) map

/*** Performs a map operation with an user-defined scalar function or a built-in scalar function.* The output will be flattened if the output type is a composite type.** <p>Example:** <pre>* {@code* ScalarFunction func = new MyMapFunction();* tableEnv.registerFunction("func", func);* tab.map("func(c)");* }* </pre>*/Table map(String mapFunction);/*** Performs a map operation with an user-defined scalar function or built-in scalar function.* The output will be flattened if the output type is a composite type.** <p>Scala Example:** <pre>* {@code* val func = new MyMapFunction()* tab.map(func('c))* }* </pre>*/Table map(Expression mapFunction);/*** Performs a flatMap operation with an user-defined table function or built-in table function.* The output will be flattened if the output type is a composite type.** <p>Example:** <pre>* {@code* TableFunction func = new MyFlatMapFunction();* tableEnv.registerFunction("func", func);* table.flatMap("func(c)");* }* </pre>*/Table flatMap(String tableFunction);/*** Performs a flatMap operation with an user-defined table function or built-in table function.* The output will be flattened if the output type is a composite type.** <p>Scala Example:** <pre>* {@code* val func = new MyFlatMapFunction* table.flatMap(func('c))* }* </pre>*/Table flatMap(Expression tableFunction);

(8)?aggregate

/*** Performs a global aggregate operation with an aggregate function. You have to close the* {@link #aggregate(String)} with a select statement. The output will be flattened if the* output type is a composite type.** <p>Example:** <pre>* {@code* AggregateFunction aggFunc = new MyAggregateFunction()* tableEnv.registerFunction("aggFunc", aggFunc);* table.aggregate("aggFunc(a, b) as (f0, f1, f2)")* .select("f0, f1")* }* </pre>*/AggregatedTable aggregate(String aggregateFunction);/*** Performs a global aggregate operation with an aggregate function. You have to close the* {@link #aggregate(Expression)} with a select statement. The output will be flattened if the* output type is a composite type.** <p>Scala Example:** <pre>* {@code* val aggFunc = new MyAggregateFunction* table.aggregate(aggFunc('a, 'b) as ('f0, 'f1, 'f2))* .select('f0, 'f1)* }* </pre>*/AggregatedTable aggregate(Expression aggregateFunction);/*** Perform a global flatAggregate without groupBy. FlatAggregate takes a TableAggregateFunction* which returns multiple rows. Use a selection after the flatAggregate.** <p>Example:** <pre>* {@code* TableAggregateFunction tableAggFunc = new MyTableAggregateFunction();* tableEnv.registerFunction("tableAggFunc", tableAggFunc);* tab.flatAggregate("tableAggFunc(a, b) as (x, y, z)")* .select("x, y, z")* }* </pre>*/FlatAggregateTable flatAggregate(String tableAggregateFunction);/*** Perform a global flatAggregate without groupBy. FlatAggregate takes a TableAggregateFunction* which returns multiple rows. Use a selection after the flatAggregate.** <p>Scala Example:** <pre>* {@code* val tableAggFunc = new MyTableAggregateFunction* tab.flatAggregate(tableAggFunc('a, 'b) as ('x, 'y, 'z))* .select('x, 'y, 'z)* }* </pre>*/FlatAggregateTable flatAggregate(Expression tableAggregateFunction);

(9)列的管理

/*** Adds additional columns. Similar to a SQL SELECT statement. The field expressions* can contain complex expressions, but can not contain aggregations. It will throw an exception* if the added fields already exist.** <p>Example:* <pre>* {@code* tab.addColumns("a + 1 as a1, concat(b, 'sunny') as b1")* }* </pre>*/Table addColumns(String fields);/*** Adds additional columns. Similar to a SQL SELECT statement. The field expressions* can contain complex expressions, but can not contain aggregations. It will throw an exception* if the added fields already exist.** <p>Scala Example:** <pre>* {@code* tab.addColumns('a + 1 as 'a1, concat('b, "sunny") as 'b1)* }* </pre>*/Table addColumns(Expression... fields);/*** Adds additional columns. Similar to a SQL SELECT statement. The field expressions* can contain complex expressions, but can not contain aggregations. Existing fields will be* replaced if add columns name is the same as the existing column name. Moreover, if the added* fields have duplicate field name, then the last one is used.** <p>Example:* <pre>* {@code* tab.addOrReplaceColumns("a + 1 as a1, concat(b, 'sunny') as b1")* }* </pre>*/Table addOrReplaceColumns(String fields);/*** Adds additional columns. Similar to a SQL SELECT statement. The field expressions* can contain complex expressions, but can not contain aggregations. Existing fields will be* replaced. If the added fields have duplicate field name, then the last one is used.** <p>Scala Example:* <pre>* {@code* tab.addOrReplaceColumns('a + 1 as 'a1, concat('b, "sunny") as 'b1)* }* </pre>*/Table addOrReplaceColumns(Expression... fields);/*** Renames existing columns. Similar to a field alias statement. The field expressions* should be alias expressions, and only the existing fields can be renamed.** <p>Example:** <pre>* {@code* tab.renameColumns("a as a1, b as b1")* }* </pre>*/Table renameColumns(String fields);/*** Renames existing columns. Similar to a field alias statement. The field expressions* should be alias expressions, and only the existing fields can be renamed.** <p>Scala Example:** <pre>* {@code* tab.renameColumns('a as 'a1, 'b as 'b1)* }* </pre>*/Table renameColumns(Expression... fields);/*** Drops existing columns. The field expressions should be field reference expressions.** <p>Example:** <pre>* {@code* tab.dropColumns("a, b")* }* </pre>*/Table dropColumns(String fields);/*** Drops existing columns. The field expressions should be field reference expressions.** <p>Scala Example:* <pre>* {@code* tab.dropColumns('a, 'b)* }* </pre>*/Table dropColumns(Expression... fields);

(10) window操作

/*** Groups the records of a table by assigning them to windows defined by a time or row interval.** <p>For streaming tables of infinite size, grouping into windows is required to define finite* groups on which group-based aggregates can be computed.** <p>For batch tables of finite size, windowing essentially provides shortcuts for time-based* groupBy.** <p><b>Note</b>: Computing windowed aggregates on a streaming table is only a parallel operation* if additional grouping attributes are added to the {@code groupBy(...)} clause.* If the {@code groupBy(...)} only references a GroupWindow alias, the streamed table will be* processed by a single task, i.e., with parallelism 1.** @param groupWindow groupWindow that specifies how elements are grouped.* @return A windowed table.*/GroupWindowedTable window(GroupWindow groupWindow);/*** Defines over-windows on the records of a table.** <p>An over-window defines for each record an interval of records over which aggregation* functions can be computed.** <p>Example:** <pre>* {@code* table* .window(Over partitionBy 'c orderBy 'rowTime preceding 10.seconds as 'ow)* .select('c, 'b.count over 'ow, 'e.sum over 'ow)* }* </pre>** <p><b>Note</b>: Computing over window aggregates on a streaming table is only a parallel* operation if the window is partitioned. Otherwise, the whole stream will be processed by a* single task, i.e., with parallelism 1.** <p><b>Note</b>: Over-windows for batch tables are currently not supported.** @param overWindows windows that specify the record interval over which aggregations are* computed.* @return An OverWindowedTable to specify the aggregations.*/OverWindowedTable window(OverWindow... overWindows);

(11) 表關聯

包括Inner join和OuterJoin

/*** Joins two {@link Table}s. Similar to a SQL join. The fields of the two joined* operations must not overlap, use {@code as} to rename fields if necessary. You can use* where and select clauses after a join to further specify the behaviour of the join.** <p>Note: Both tables must be bound to the same {@code TableEnvironment} .** <p>Example:** <pre>* {@code* left.join(right).where("a = b && c > 3").select("a, b, d")* }* </pre>*/Table join(Table right);/*** Joins two {@link Table}s. Similar to a SQL join. The fields of the two joined* operations must not overlap, use {@code as} to rename fields if necessary.** <p>Note: Both tables must be bound to the same {@code TableEnvironment} .** <p>Example:** <pre>* {@code* left.join(right, "a = b")* }* </pre>*/Table join(Table right, String joinPredicate);/*** Joins two {@link Table}s. Similar to a SQL join. The fields of the two joined* operations must not overlap, use {@code as} to rename fields if necessary.** <p>Note: Both tables must be bound to the same {@code TableEnvironment} .** <p>Scala Example:** <pre>* {@code* left.join(right, 'a === 'b).select('a, 'b, 'd)* }* </pre>*/Table join(Table right, Expression joinPredicate);/*** Joins two {@link Table}s. Similar to a SQL left outer join. The fields of the two joined* operations must not overlap, use {@code as} to rename fields if necessary.** <p>Note: Both tables must be bound to the same {@code TableEnvironment} and its* {@code TableConfig} must have null check enabled (default).** <p>Example:** <pre>* {@code* left.leftOuterJoin(right).select("a, b, d")* }* </pre>*/Table leftOuterJoin(Table right);/*** Joins two {@link Table}s. Similar to a SQL left outer join. The fields of the two joined* operations must not overlap, use {@code as} to rename fields if necessary.** <p>Note: Both tables must be bound to the same {@code TableEnvironment} and its* {@code TableConfig} must have null check enabled (default).** <p>Example:** <pre>* {@code* left.leftOuterJoin(right, "a = b").select("a, b, d")* }* </pre>*/Table leftOuterJoin(Table right, String joinPredicate);/*** Joins two {@link Table}s. Similar to a SQL left outer join. The fields of the two joined* operations must not overlap, use {@code as} to rename fields if necessary.** <p>Note: Both tables must be bound to the same {@code TableEnvironment} and its* {@code TableConfig} must have null check enabled (default).** <p>Scala Example:** <pre>* {@code* left.leftOuterJoin(right, 'a === 'b).select('a, 'b, 'd)* }* </pre>*/Table leftOuterJoin(Table right, Expression joinPredicate);/*** Joins two {@link Table}s. Similar to a SQL right outer join. The fields of the two joined* operations must not overlap, use {@code as} to rename fields if necessary.** <p>Note: Both tables must be bound to the same {@code TableEnvironment} and its* {@code TableConfig} must have null check enabled (default).** <p>Example:** <pre>* {@code* left.rightOuterJoin(right, "a = b").select("a, b, d")* }* </pre>*/Table rightOuterJoin(Table right, String joinPredicate);/*** Joins two {@link Table}s. Similar to a SQL right outer join. The fields of the two joined* operations must not overlap, use {@code as} to rename fields if necessary.** <p>Note: Both tables must be bound to the same {@code TableEnvironment} and its* {@code TableConfig} must have null check enabled (default).** <p>Scala Example:** <pre>* {@code* left.rightOuterJoin(right, 'a === 'b).select('a, 'b, 'd)* }* </pre>*/Table rightOuterJoin(Table right, Expression joinPredicate);/*** Joins two {@link Table}s. Similar to a SQL full outer join. The fields of the two joined* operations must not overlap, use {@code as} to rename fields if necessary.** <p>Note: Both tables must be bound to the same {@code TableEnvironment} and its* {@code TableConfig} must have null check enabled (default).** <p>Example:** <pre>* {@code* left.fullOuterJoin(right, "a = b").select("a, b, d")* }* </pre>*/Table fullOuterJoin(Table right, String joinPredicate);/*** Joins two {@link Table}s. Similar to a SQL full outer join. The fields of the two joined* operations must not overlap, use {@code as} to rename fields if necessary.** <p>Note: Both tables must be bound to the same {@code TableEnvironment} and its* {@code TableConfig} must have null check enabled (default).** <p>Scala Example:** <pre>* {@code* left.fullOuterJoin(right, 'a === 'b).select('a, 'b, 'd)* }* </pre>*/Table fullOuterJoin(Table right, Expression joinPredicate);/*** Joins this {@link Table} with an user-defined {@link TableFunction}. This join is similar to* a SQL inner join with ON TRUE predicate but works with a table function. Each row of the* table is joined with all rows produced by the table function.** <p>Example:** <pre>* {@code* class MySplitUDTF extends TableFunction<String> {* public void eval(String str) {* str.split("#").forEach(this::collect);* }* }** TableFunction<String> split = new MySplitUDTF();* tableEnv.registerFunction("split", split);* table.joinLateral("split(c) as (s)").select("a, b, c, s");* }* </pre>*/Table joinLateral(String tableFunctionCall);/*** Joins this {@link Table} with an user-defined {@link TableFunction}. This join is similar to* a SQL inner join with ON TRUE predicate but works with a table function. Each row of the* table is joined with all rows produced by the table function.** <p>Scala Example:** <pre>* {@code* class MySplitUDTF extends TableFunction[String] {* def eval(str: String): Unit = {* str.split("#").foreach(collect)* }* }** val split = new MySplitUDTF()* table.joinLateral(split('c) as ('s)).select('a, 'b, 'c, 's)* }* </pre>*/Table joinLateral(Expression tableFunctionCall);/*** Joins this {@link Table} with an user-defined {@link TableFunction}. This join is similar to* a SQL inner join with ON TRUE predicate but works with a table function. Each row of the* table is joined with all rows produced by the table function.** <p>Example:** <pre>* {@code* class MySplitUDTF extends TableFunction<String> {* public void eval(String str) {* str.split("#").forEach(this::collect);* }* }** TableFunction<String> split = new MySplitUDTF();* tableEnv.registerFunction("split", split);* table.joinLateral("split(c) as (s)", "a = s").select("a, b, c, s");* }* </pre>*/Table joinLateral(String tableFunctionCall, String joinPredicate);/*** Joins this {@link Table} with an user-defined {@link TableFunction}. This join is similar to* a SQL inner join with ON TRUE predicate but works with a table function. Each row of the* table is joined with all rows produced by the table function.** <p>Scala Example:** <pre>* {@code* class MySplitUDTF extends TableFunction[String] {* def eval(str: String): Unit = {* str.split("#").foreach(collect)* }* }** val split = new MySplitUDTF()* table.joinLateral(split('c) as ('s), 'a === 's).select('a, 'b, 'c, 's)* }* </pre>*/Table joinLateral(Expression tableFunctionCall, Expression joinPredicate);/*** Joins this {@link Table} with an user-defined {@link TableFunction}. This join is similar to* a SQL left outer join with ON TRUE predicate but works with a table function. Each row of* the table is joined with all rows produced by the table function. If the table function does* not produce any row, the outer row is padded with nulls.** <p>Example:** <pre>* {@code* class MySplitUDTF extends TableFunction<String> {* public void eval(String str) {* str.split("#").forEach(this::collect);* }* }** TableFunction<String> split = new MySplitUDTF();* tableEnv.registerFunction("split", split);* table.leftOuterJoinLateral("split(c) as (s)").select("a, b, c, s");* }* </pre>*/Table leftOuterJoinLateral(String tableFunctionCall);/*** Joins this {@link Table} with an user-defined {@link TableFunction}. This join is similar to* a SQL left outer join with ON TRUE predicate but works with a table function. Each row of* the table is joined with all rows produced by the table function. If the table function does* not produce any row, the outer row is padded with nulls.** <p>Scala Example:** <pre>* {@code* class MySplitUDTF extends TableFunction[String] {* def eval(str: String): Unit = {* str.split("#").foreach(collect)* }* }** val split = new MySplitUDTF()* table.leftOuterJoinLateral(split('c) as ('s)).select('a, 'b, 'c, 's)* }* </pre>*/Table leftOuterJoinLateral(Expression tableFunctionCall);/*** Joins this {@link Table} with an user-defined {@link TableFunction}. This join is similar to* a SQL left outer join with ON TRUE predicate but works with a table function. Each row of* the table is joined with all rows produced by the table function. If the table function does* not produce any row, the outer row is padded with nulls.** <p>Example:** <pre>* {@code* class MySplitUDTF extends TableFunction<String> {* public void eval(String str) {* str.split("#").forEach(this::collect);* }* }** TableFunction<String> split = new MySplitUDTF();* tableEnv.registerFunction("split", split);* table.leftOuterJoinLateral("split(c) as (s)", "a = s").select("a, b, c, s");* }* </pre>*/Table leftOuterJoinLateral(String tableFunctionCall, String joinPredicate);/*** Joins this {@link Table} with an user-defined {@link TableFunction}. This join is similar to* a SQL left outer join with ON TRUE predicate but works with a table function. Each row of* the table is joined with all rows produced by the table function. If the table function does* not produce any row, the outer row is padded with nulls.** <p>Scala Example:** <pre>* {@code* class MySplitUDTF extends TableFunction[String] {* def eval(str: String): Unit = {* str.split("#").foreach(collect)* }* }** val split = new MySplitUDTF()* table.leftOuterJoinLateral(split('c) as ('s), 'a === 's).select('a, 'b, 'c, 's)* }* </pre>*/Table leftOuterJoinLateral(Expression tableFunctionCall, Expression joinPredicate);

(12) 集合操作

/*** Minus of two {@link Table}s with duplicate records removed.* Similar to a SQL EXCEPT clause. Minus returns records from the left table that do not* exist in the right table. Duplicate records in the left table are returned* exactly once, i.e., duplicates are removed. Both tables must have identical field types.** <p>Note: Both tables must be bound to the same {@code TableEnvironment}.** <p>Example:** <pre>* {@code* left.minus(right)* }* </pre>*/Table minus(Table right);/*** Minus of two {@link Table}s. Similar to a SQL EXCEPT ALL.* Similar to a SQL EXCEPT ALL clause. MinusAll returns the records that do not exist in* the right table. A record that is present n times in the left table and m times* in the right table is returned (n - m) times, i.e., as many duplicates as are present* in the right table are removed. Both tables must have identical field types.** <p>Note: Both tables must be bound to the same {@code TableEnvironment}.** <p>Example:** <pre>* {@code* left.minusAll(right)* }* </pre>*/Table minusAll(Table right);/*** Unions two {@link Table}s with duplicate records removed.* Similar to a SQL UNION. The fields of the two union operations must fully overlap.** <p>Note: Both tables must be bound to the same {@code TableEnvironment}.** <p>Example:** <pre>* {@code* left.union(right)* }* </pre>*/Table union(Table right);/*** Unions two {@link Table}s. Similar to a SQL UNION ALL. The fields of the two union* operations must fully overlap.** <p>Note: Both tables must be bound to the same {@code TableEnvironment}.** <p>Example:** <pre>* {@code* left.unionAll(right)* }* </pre>*/Table unionAll(Table right);/*** Intersects two {@link Table}s with duplicate records removed. Intersect returns records that* exist in both tables. If a record is present in one or both tables more than once, it is* returned just once, i.e., the resulting table has no duplicate records. Similar to a* SQL INTERSECT. The fields of the two intersect operations must fully overlap.** <p>Note: Both tables must be bound to the same {@code TableEnvironment}.** <p>Example:** <pre>* {@code* left.intersect(right)* }* </pre>*/Table intersect(Table right);/*** Intersects two {@link Table}s. IntersectAll returns records that exist in both tables.* If a record is present in both tables more than once, it is returned as many times as it* is present in both tables, i.e., the resulting table might have duplicate records. Similar* to an SQL INTERSECT ALL. The fields of the two intersect operations must fully overlap.** <p>Note: Both tables must be bound to the same {@code TableEnvironment}.** <p>Example:** <pre>* {@code* left.intersectAll(right)* }* </pre>*/Table intersectAll(Table right);

(13) 創建臨時表

/*** Creates {@link TemporalTableFunction} backed up by this table as a history table.* Temporal Tables represent a concept of a table that changes over time and for which* Flink keeps track of those changes. {@link TemporalTableFunction} provides a way how to* access those data.** <p>For more information please check Flink's documentation on Temporal Tables.** <p>Currently {@link TemporalTableFunction}s are only supported in streaming.** @param timeAttribute Must points to a time attribute. Provides a way to compare which* records are a newer or older version.* @param primaryKey Defines the primary key. With primary key it is possible to update* a row or to delete it.* @return {@link TemporalTableFunction} which is an instance of {@link TableFunction}.* It takes one single argument, the {@code timeAttribute}, for which it returns* matching version of the {@link Table}, from which {@link TemporalTableFunction}* was created.*/TemporalTableFunction createTemporalTableFunction(String timeAttribute, String primaryKey);/*** Creates {@link TemporalTableFunction} backed up by this table as a history table.* Temporal Tables represent a concept of a table that changes over time and for which* Flink keeps track of those changes. {@link TemporalTableFunction} provides a way how to* access those data.** <p>For more information please check Flink's documentation on Temporal Tables.** <p>Currently {@link TemporalTableFunction}s are only supported in streaming.** @param timeAttribute Must points to a time indicator. Provides a way to compare which* records are a newer or older version.* @param primaryKey Defines the primary key. With primary key it is possible to update* a row or to delete it.* @return {@link TemporalTableFunction} which is an instance of {@link TableFunction}.* It takes one single argument, the {@code timeAttribute}, for which it returns* matching version of the {@link Table}, from which {@link TemporalTableFunction}* was created.*/TemporalTableFunction createTemporalTableFunction(Expression timeAttribute, Expression primaryKey);

(14) 重命名

/*** Renames the fields of the expression result. Use this to disambiguate fields before* joining to operations.** <p>Example:** <pre>* {@code* tab.as("a, b")* }* </pre>*/Table as(String fields);/*** Renames the fields of the expression result. Use this to disambiguate fields before* joining to operations.** <p>Scala Example:** <pre>* {@code* tab.as('a, 'b)* }* </pre>*/Table as(Expression... fields);/*** Filters out elements that don't pass the filter predicate. Similar to a SQL WHERE* clause.** <p>Example:** <pre>* {@code* tab.filter("name = 'Fred'")* }* </pre>*/

(15)插入數據表

/*** Writes the {@link Table} to a {@link TableSink} that was registered under the specified path.* For the path resolution algorithm see {@link TableEnvironment#useDatabase(String)}.** <p>A batch {@link Table} can only be written to a* {@code org.apache.flink.table.sinks.BatchTableSink}, a streaming {@link Table} requires a* {@code org.apache.flink.table.sinks.AppendStreamTableSink}, a* {@code org.apache.flink.table.sinks.RetractStreamTableSink}, or an* {@code org.apache.flink.table.sinks.UpsertStreamTableSink}.** @param tablePath The first part of the path of the registered {@link TableSink} to which the {@link Table} is* written. This is to ensure at least the name of the {@link TableSink} is provided.* @param tablePathContinued The remaining part of the path of the registered {@link TableSink} to which the* {@link Table} is written.*/void insertInto(String tablePath, String... tablePathContinued);/*** Writes the {@link Table} to a {@link TableSink} that was registered under the specified name* in the initial default catalog.** <p>A batch {@link Table} can only be written to a* {@code org.apache.flink.table.sinks.BatchTableSink}, a streaming {@link Table} requires a* {@code org.apache.flink.table.sinks.AppendStreamTableSink}, a* {@code org.apache.flink.table.sinks.RetractStreamTableSink}, or an* {@code org.apache.flink.table.sinks.UpsertStreamTableSink}.** @param tableName The name of the {@link TableSink} to which the {@link Table} is written.* @param conf The {@link QueryConfig} to use.* @deprecated use {@link #insertInto(QueryConfig, String, String...)}*/@Deprecatedvoid insertInto(String tableName, QueryConfig conf);/*** Writes the {@link Table} to a {@link TableSink} that was registered under the specified path.* For the path resolution algorithm see {@link TableEnvironment#useDatabase(String)}.** <p>A batch {@link Table} can only be written to a* {@code org.apache.flink.table.sinks.BatchTableSink}, a streaming {@link Table} requires a* {@code org.apache.flink.table.sinks.AppendStreamTableSink}, a* {@code org.apache.flink.table.sinks.RetractStreamTableSink}, or an* {@code org.apache.flink.table.sinks.UpsertStreamTableSink}.** @param conf The {@link QueryConfig} to use.* @param tablePath The first part of the path of the registered {@link TableSink} to which the {@link Table} is* written. This is to ensure at least the name of the {@link TableSink} is provided.* @param tablePathContinued The remaining part of the path of the registered {@link TableSink} to which the* {@link Table} is written.*/void insertInto(QueryConfig conf, String tablePath, String... tablePathContinued);

總結:

本篇抓住Table api的核心類Table來發現其擁有的功能,并提供了使用用例。Flink Table Api 主要包括了查詢select,條件where,過濾filter,排序order by,分組group by,去重distinct,表關聯join,重命名as等常規sql操作,也提供了flink自身特性的操作:

窗口操作window,表聚合操作,map操作,aggregate操作。

轉載于:https://www.cnblogs.com/davidwang456/p/11196675.html

總結

以上是生活随笔為你收集整理的使用flink Table Sql api来构建批量和流式应用(2)Table API概述的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

亚洲 欧洲av | 亚洲国产精品推荐 | 精品视频中文字幕 | 久草精品在线 | 激情网站网址 | 在线日本看片免费人成视久网 | 午夜精品视频福利 | 国产精品高清免费在线观看 | 久久久久久久精 | 国产一级在线视频 | 天天干,夜夜操 | 国产专区在线视频 | av电影在线免费 | 精品99久久久久久 | 国产中文字幕视频在线观看 | 麻豆免费视频网站 | 13日本xxxxxⅹxxx20 | 久久国产电影院 | 天天躁天天操 | 日韩理论片 | 99精品视频免费全部在线 | 国产精品午夜在线 | 欧美精品久久久久久久久老牛影院 | 日韩欧美v| 有码视频在线观看 | 日本3级在线观看 | 中文字幕观看在线 | 国产精品资源在线 | 狠狠狠狠狠狠狠 | 亚洲激情综合 | 国产一区欧美二区 | 又黄又网站| 国产精品原创 | 999久久 | ww视频在线观看 | 欧美激情精品久久久久久 | 四虎国产精品免费观看视频优播 | 天天要夜夜操 | 香蕉网在线观看 | 97碰视频| 日韩免费av在线 | 亚洲国产中文字幕在线观看 | 狠狠干天天射 | 一区二区三区在线免费观看视频 | 亚洲精品午夜aaa久久久 | 午夜色婷婷 | 99综合影院在线 | 成人 亚洲 欧美 | 国产黄a三级三级三级三级三级 | 91日韩精品一区 | 欧美一级久久久 | 欧美久久久久久久久中文字幕 | 91欧美精品| 国产一级免费在线 | 亚洲视频一级 | 亚洲免费在线看 | 久久久精品欧美一区二区免费 | 国产精品99久久久 | 青青射 | 啪啪精品 | 国产精品资源网 | 欧美成人理伦片 | 国产精品麻豆视频 | 成人性生交大片免费观看网站 | 天天综合区 | 日本性生活一级片 | 亚洲综合在线五月天 | 国产理论一区二区三区 | 中文字幕精品一区二区精品 | 国产精品网在线观看 | 国产精品va最新国产精品视频 | 天天干天天做天天爱 | 婷婷在线不卡 | 久久精品麻豆 | 国产亚洲成人网 | 国产精品一码二码三码在线 | 四虎成人在线 | 成片视频免费观看 | 五月天天在线 | 视频在线亚洲 | 六月婷婷久香在线视频 | 综合网伊人 | 欧美午夜一区二区福利视频 | 深夜免费福利在线 | 亚洲午夜久久久久 | 精品国产一区二 | 亚洲精品综合在线观看 | 91成人精品一区在线播放69 | 亚洲成人精品在线观看 | 中文字幕在线影院 | 久久久久久美女 | 超碰在线97国产 | 久久久久精 | 婷婷av网站 | 国产精品久久久久久久久搜平片 | 日韩在线视频网址 | av在线播放免费 | 久久99精品久久久久久清纯直播 | 亚洲国产中文字幕在线视频综合 | 日韩乱色精品一区二区 | 国产91在线 | 美洲 | 色先锋资源网 | 亚洲四虎在线 | 在线观看国产一区二区 | 久久久国产视频 | 国产精品一区二区中文字幕 | 日韩91精品 | 成人资源在线 | 国产999精品久久久久久 | 日韩精品一区二区三区水蜜桃 | 国产精品青草综合久久久久99 | 国产精品女同一区二区三区久久夜 | 麻花豆传媒mv在线观看网站 | 久精品视频| 国产一区二区不卡视频 | 丁香影院在线 | 麻豆91在线看 | 成人免费一级 | 成年人在线观看免费视频 | 成人午夜电影在线 | 日韩av影视在线观看 | 香蕉影视app | 狠狠色丁香久久婷婷综 | 成人午夜电影网站 | 久久夜色精品国产欧美一区麻豆 | 久综合网| 中文字幕一区二区在线观看 | 国产一级淫片免费看 | www.xxxx欧美 | 中文字幕乱偷在线 | 夜夜操天天 | 久久理论片 | 99精品视频免费在线观看 | 国产亚洲精品xxoo | 欧美最猛性xxxx | 99久久99久久精品国产片果冰 | 久久精品福利 | 中文字幕中文字幕 | 91成人精品观看 | 天天色天天综合网 | av韩国在线 | 国产精品视频免费在线观看 | 在线看一级片 | 久草在线视频首页 | 欧美另类高清 | 99热精品国产一区二区在线观看 | 99精品国产高清在线观看 | 久久国产品 | 免费福利视频导航 | 久久成人免费 | 一区二区三区免费在线观看 | 999久久久免费精品国产 | 久草电影免费在线观看 | 日韩三级视频 | 这里只有精品视频在线观看 | 欧美一级片在线免费观看 | 欧美激情精品久久久久久变态 | 99国产成+人+综合+亚洲 欧美 | 99精品免费久久久久久久久 | 国产午夜三级一二三区 | 91看片在线观看 | 麻豆传媒电影在线观看 | 成人国产精品免费 | 中文字幕视频播放 | 日韩电影在线一区 | 天天射,天天干 | 日韩精品欧美专区 | 香蕉看片 | 一区二区电影在线观看 | 精品亚洲免费视频 | 在线中文字幕播放 | 一级黄色电影网站 | 午夜精品一区二区三区四区 | 成人免费视频在线观看 | 97视频免费看 | 久久久男人的天堂 | 日本高清免费中文字幕 | 天天操比 | 亚洲国产日韩欧美 | 久久99国产精品二区护士 | 成人午夜剧场在线观看 | 欧美 日韩 国产 成人 在线 | 国产精品99在线观看 | 久久免费的精品国产v∧ | 国产精品久久久久久久久久不蜜月 | 波多野结衣动态图 | 在线观看中文字幕亚洲 | 亚洲无吗av | 久久久久久国产精品 | 成人性生交大片免费观看网站 | 99久久99久久免费精品蜜臀 | 日韩中文字幕电影 | 国产一级91 | 中文资源在线播放 | 人人澡人人爽欧一区 | 超碰人人在| 久久优 | 国产网站av | 丁香视频 | 97视频人人澡人人爽 | 久久久久久久久影视 | 亚洲国产精品影院 | 成人av片免费看 | 成人黄色片在线播放 | 天天操天天草 | av电影免费在线看 | 久久深夜福利免费观看 | 精品久久一区二区 | 一区二区三区在线影院 | 欧美成人h版电影 | 五月天丁香综合 | 国产一区视频导航 | 天天干夜夜爱 | 欧美性爽爽 | 国产亚洲欧美精品久久久久久 | 亚洲成av人片在线观看 | 色综合婷婷 | a在线v| 国产a免费| 在线网址你懂得 | 日韩三级成人 | 色偷偷网站视频 | 国产正在播放 | 亚洲精品在线国产 | 日本黄色免费在线 | 91精品久久久久久综合乱菊 | 在线免费91 | 在线观看视频精品 | 国产99久久99热这里精品5 | 91精品电影 | 婷婷视频在线播放 | 黄色免费观看网址 | 91av综合 | 在线播放亚洲 | 91久久久久久久一区二区 | 玖玖在线看 | 国产精品久久综合 | 亚洲精品美女在线观看播放 | 97超碰在线资源 | 国产激情久久久 | 国产黄色电影 | 成人在线视| 免费色视频网站 | 91香蕉国产 | 久久精品视频网址 | 四虎在线免费观看 | 日本精品在线视频 | 九色免费视频 | 久久国产高清视频 | 免费av 在线| 欧美精品免费一区二区 | 国产专区第一页 | 欧亚日韩精品一区二区在线 | 99在线精品免费视频九九视 | .精品久久久麻豆国产精品 亚洲va欧美 | 久久精品久久99 | 欧美成人高清 | 色综久久 | 九九精品毛片 | 日韩在线中文字幕视频 | 久久精品网址 | 国产高清黄 | 在线小视频你懂得 | 在线亚洲免费视频 | 成人免费在线观看av | 97人人模人人爽人人喊中文字 | 97免费在线观看视频 | 日韩免费av网址 | 美女黄频在线观看 | 久久综合精品国产一区二区三区 | 国产高清精品在线 | 久久久国产网站 | 91精品国产成人www | 久热av在线 | 国产一区二区影院 | 在线免费色 | 亚洲精品免费视频 | 黄色国产区 | 日日久视频| 超碰在线人 | 中文字幕高清视频 | 伊人国产在线播放 | 中文字幕在线观看免费观看 | 精品久久久久久久久亚洲 | 精品国产一区二区三区久久影院 | 国产福利精品在线观看 | 久久精品福利视频 | 91色一区二区三区 | 天天操天天射天天添 | 狠狠躁日日躁 | 国产91小视频 | 国产高清在线一区 | 日韩在线电影观看 | 中文字幕电影在线 | 久久激情片 | 天天爱天天射天天干天天 | 精品国产诱惑 | av成人动漫在线观看 | 碰天天操天天 | 91色一区二区三区 | 天天射网站 | 日日综合网 | 亚洲黄色在线免费观看 | 中文字幕在线观看91 | 天天射网 | 欧美日本一区 | 不卡av在线 | 久久久久久久久久久福利 | 99精品国产福利在线观看免费 | 国产成人免费高清 | 麻豆免费在线视频 | 中文字幕字幕中文 | 成人免费av电影 | 中文字幕丝袜一区二区 | 91成人在线观看喷潮 | 夜夜操天天 | 中文视频在线看 | 免费在线观看一区二区三区 | av成人免费在线看 | 久久久久免费电影 | 国产精品一区二区三区电影 | 97视频在线免费观看 | 高清久久久 | 午夜三级毛片 | 一区二区三区在线不卡 | 999色视频 | 99精品视频在线观看免费 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 亚洲综合激情 | 免费av片在线 | 又紧又大又爽精品一区二区 | 成人在线免费小视频 | 91麻豆国产福利在线观看 | 国产精品无av码在线观看 | 三级在线视频播放 | 99久久日韩精品视频免费在线观看 | 色噜噜狠狠狠狠色综合久不 | 国产在线污 | 天天干,狠狠干 | 成人黄色在线观看视频 | 中文字幕在线色 | 亚洲 中文 在线 精品 | 国产五十路毛片 | 午夜精品视频一区二区三区在线看 | 亚洲色综合 | 国产专区欧美专区 | 欧美一级片在线观看视频 | 久久96国产精品久久99软件 | 亚洲高清视频在线播放 | 国产综合香蕉五月婷在线 | 亚洲乱亚洲乱妇 | 日日夜夜干| av网站播放 | 天天摸天天操天天爽 | 91视频久久久久 | 国产一区二区在线观看视频 | 久久久久久久国产精品影院 | 九九免费在线观看视频 | 国产精品久久久久婷婷二区次 | 久久免费成人网 | 天天人人综合 | 婷婷丁香av | 丁香花在线视频观看免费 | 色 免费观看 | 欧美欧美 | 99国产精品视频免费观看一公开 | 综合色中文 | 正在播放日韩 | 欧美精品xxx | 久久久久久免费视频 | 欧美aaa大片| 欧美超碰在线 | 国产成人一区二区三区在线观看 | 精品国产观看 | a级免费观看 | 91在线免费视频观看 | 日本久久99 | 97网在线观看 | 中文字幕.av.在线 | 日韩天天操 | 涩五月婷婷 | 免费观看国产视频 | 91久草视频 | 韩国视频一区二区三区 | 国产日韩精品一区二区在线观看播放 | 久久精品视频免费播放 | 免费av影视 | 超碰最新网址 | 天天干婷婷 | 久草免费福利在线观看 | 在线视频app | 波多野结衣网址 | 麻豆系列在线观看 | 7777xxxx | 亚洲美女视频在线观看 | 国产色资源| 人人玩人人添人人 | 国产精品v欧美精品 | 欧美不卡视频在线 | 成人免费大片黄在线播放 | 久久国产成人午夜av影院潦草 | 永久免费毛片在线观看 | 黄污污网站 | 人人插人人看 | 中文字幕在线日 | 国产这里只有精品 | 深夜男人影院 | 欧美一二三视频 | av一区二区三区在线播放 | 久久久久久久久综合 | 久久久久久久久久久久亚洲 | 一本一本久久a久久精品牛牛影视 | 91视频麻豆视频 | 九九久久国产精品 | 天天色天天射天天干 | 久久草视频 | 免费高清看电视网站 | 最近中文字幕mv | 91精品国产综合久久福利 | 国产成人精品亚洲a | 在线观看韩日电影免费 | 99久久久| 97国产精品 | 午夜三级大片 | 三级动态视频在线观看 | 日韩精品久久久免费观看夜色 | 麻豆免费在线播放 | 国产成人一区二区三区在线观看 | 久久毛片高清国产 | 美女国产| 日本公妇在线观看高清 | 久久天天躁夜夜躁狠狠85麻豆 | 九九爱免费视频 | 国产精品一区二区免费在线观看 | 久草网视频在线观看 | 在线黄色观看 | 五月天色丁香 | av资源在线看| 久久久www | 免费色视频网站 | 日韩欧美一区二区在线播放 | 国产99久久久国产精品 | 天天干com| 免费高清国产 | 日韩成人精品一区二区三区 | 日韩精品久久久 | 欧美一二区在线 | 在线观看色网 | 夜夜躁狠狠躁日日躁视频黑人 | 欧美久久久久 | 91九色在线 | 精品在线观看一区二区三区 | 婷婷久久丁香 | 久久婷婷色综合 | 国产一性一爱一乱一交 | 国产精品中文字幕在线观看 | 亚洲精品一区二区精华 | 久久久久久久免费观看 | 国产在线a视频 | a级国产乱理论片在线观看 伊人宗合网 | 午夜视频一区二区 | 欧美一级免费片 | 水蜜桃亚洲一二三四在线 | 国产精品 中文在线 | 久久99最新地址 | 久草在线国产 | 69久久99精品久久久久婷婷 | 99在线国产 | 中文久草 | 91麻豆精品国产91久久久久久久久 | 国产精品99久久久精品 | 高清一区二区三区 | 中文字幕av最新更新 | 日韩综合视频在线观看 | 免费看一级一片 | 欧美精品资源 | 色婷婷导航 | 在线观看中文字幕视频 | 视频在线亚洲 | 亚洲精品美女久久久 | 国产一级片网站 | 在线观看日韩国产 | 一区二区不卡在线观看 | 欧美日韩精品在线一区二区 | 久久久影视 | 91精品蜜桃 | 91精品在线免费 | 五月天天色 | 国产va饥渴难耐女保洁员在线观看 | 一级免费观看 | 免费看黄20分钟 | 91在线看网站 | 亚洲成av人片在线观看 | 日本久久免费视频 | 日本黄色黄网站 | 五月婷婷视频 | 91精品91 | 91看片在线 | 免费看三片 | 成人黄色在线观看视频 | 国产亚洲精品久久久久久大师 | 久草电影在线观看 | 人人插人人玩 | 丰满少妇在线观看资源站 | 天天综合网~永久入口 | 日日爽夜夜操 | 日韩免费视频一区二区 | 久一在线 | 亚洲黄色免费在线看 | 中文字幕刺激在线 | 日韩久久精品一区二区三区下载 | 99视频精品免费视频 | 91色在线观看视频 | 射久久| 人人看人人草 | 国产精品麻豆欧美日韩ww | 视频国产| 在线播放精品一区二区三区 | 美女视频黄是免费的 | 在线观看91精品视频 | 黄色国产在线观看 | 国产99区 | 亚洲精品在线国产 | 蜜臀av在线一区二区三区 | 国产一区二区影院 | 亚州精品天堂中文字幕 | 高清av在线免费观看 | 婷婷综合久久 | 色综合天天爱 | 98涩涩国产露脸精品国产网 | 91最新在线视频 | 日韩伦理片一区二区三区 | 日日操日日操 | 成人小视频在线免费观看 | 亚洲精品理论 | 天天艹天天 | 精品国产自 | 中文字幕免费 | 97av在线 | 久久伊人精品天天 | 2019精品手机国产品在线 | 国产精品美女免费 | 天天天操天天天干 | 97国产小视频 | 69久久99精品久久久久婷婷 | 免费观看性生活大片 | 久久草在线精品 | 国产精品久久久久久久久久久不卡 | 在线免费高清视频 | 黄色av免费看| 色视频国产直接看 | 欧美激情亚洲综合 | 亚洲综合欧美精品电影 | 久久成人一区二区 | 国产精品国产毛片 | 大型av综合网站 | 在线免费看黄色 | 欧美疯狂性受xxxxx另类 | 九九免费在线观看视频 | 99久久99久久精品 | 99热超碰| 中文字幕精 | 亚洲区另类春色综合小说校园片 | 91在线精品一区二区 | 久久久精品二区 | 九九九热精品免费视频观看网站 | 久久综合久久88 | 91av色 | 色婷婷福利 | 偷拍精偷拍精品欧洲亚洲网站 | 欧美与欧洲交xxxx免费观看 | 亚洲综合成人婷婷小说 | 狠狠的日| 欧美一进一出抽搐大尺度视频 | 日韩欧美一区二区三区视频 | 久热免费在线观看 | av 一区二区三区四区 | 四虎5151久久欧美毛片 | av综合网址| 亚洲精品资源在线观看 | 黄色av一级片 | 天天干,夜夜爽 | 久草91视频| 欧美日韩高清在线 | 午夜精品久久久久久久久久久久久久 | 大型av综合网站 | 欧美日本中文字幕 | 国产精品高潮呻吟久久久久 | 亚洲精品国产区 | 视频高清| 黄色三几片 | 亚洲毛片视频 | 蜜桃视频日韩 | 久久一精品 | 欧美成天堂网地址 | 手机看片中文字幕 | 国产九色在线播放九色 | 日本高清中文字幕有码在线 | 操操碰 | av成人黄色 | 免费高清在线视频一区· | 亚洲黄色a| 在线观看片| 99亚洲精品在线 | 国产精品18毛片一区二区 | 国产一区黄色 | 天天透天天插 | 天天综合日 | 成人免费看视频 | 日韩a免费 | 日本黄色免费在线 | 996久久国产精品线观看 | 国产高清在线观看av | 色99久久| 在线视频婷婷 | 天堂网一区二区 | 天天看天天干 | 亚洲人成在线电影 | 三级小视频在线观看 | 天天操夜夜操 | 天天拍天天爽 | 亚洲专区中文字幕 | 国产精品午夜久久 | 日韩视频免费看 | 亚洲午夜久久久久久久久 | 在线免费观看视频a | 欧美亚洲国产精品久久高清浪潮 | 不卡av电影在线 | 免费黄色在线播放 | 欧美成人999 | 999成人国产 | 久久久久久伊人 | 高清av在线免费观看 | 欧美a级在线 | 日韩av一区二区三区四区 | 欧美日韩成人 | 国产精品 日韩精品 | 亚洲天堂va| 久久亚洲电影 | 亚洲在线 | 97超碰人人干 | 美女国产免费 | 色综合天天视频在线观看 | 色综合久久久久久中文网 | 久久婷婷丁香 | 欧美a级在线免费观看 | 正在播放国产精品 | 又黄又刺激的网站 | av福利电影 | 日日干夜夜操视频 | 久久官网 | 久久久天天操 | 国产精品mm | 97爱| 在线国产日韩 | 天堂网一区 | 五月激情丁香婷婷 | 天天射网 | 婷婷在线资源 | 日韩免费视频 | 国产精品久久久久久久久久久不卡 | 黄色av电影免费观看 | 精品美女视频 | 亚洲高清视频在线观看免费 | 欧美性色综合网站 | 9久久精品| 丁香六月久久综合狠狠色 | 欧美精品天堂 | 美女视频免费一区二区 | 91精品国产自产老师啪 | 在线观看爱爱视频 | 成年人视频在线免费 | 午夜精品电影一区二区在线 | 激情综合网五月婷婷 | 99这里都是精品 | 亚洲午夜在线视频 | 亚洲综合色视频 | 91精品久久久久久 | 男女啪啪视屏 | 久久人人97超碰精品888 | 夜夜骑天天操 | 三级动态视频在线观看 | 日韩在线视频一区二区三区 | 午夜影院在线观看18 | 国产乱码精品一区二区三区介绍 | 91大神一区二区三区 | 婷婷六月综合亚洲 | 国产视频精品免费播放 | 日韩在线电影 | 久久国产精品小视频 | av成人动漫在线观看 | 久久国产精品免费 | 五月婷影院 | 国产无遮挡又黄又爽馒头漫画 | 日韩成人高清在线 | 国产亚洲精品久久久久秋 | a视频在线观看 | 国产999精品久久久影片官网 | 婷婷在线精品视频 | 99资源网| 免费观看成人网 | 国产高清综合 | www国产一区 | 久久久久久久综合色一本 | 三级av免费看 | 天天插伊人 | 免费婷婷 | 三级黄色a | 久久午夜精品影院一区 | 亚洲乱码中文字幕综合 | www视频在线免费观看 | 国产成人精品久 | 麻豆系列在线观看 | 国产999精品久久久影片官网 | 婷婷色社区 | 天堂网在线视频 | 日韩久久久久久久久久 | 99热在线这里只有精品 | 国产丝袜一区二区三区 | 国产一线二线三线性视频 | av在线永久免费观看 | 亚洲天天在线 | 久久天天躁狠狠躁夜夜不卡公司 | 亚洲天堂香蕉 | 国产二级视频 | 国产在线综合视频 | 国产伦精品一区二区三区免费 | 国产成人99av超碰超爽 | 天天干天天干天天干 | 亚洲在线激情 | 精品在线观 | 亚洲最新视频在线 | 日韩电影中文,亚洲精品乱码 | 五月婷婷.com | 欧美精品久久天天躁 | 99精品一级欧美片免费播放 | 日韩一级电影网站 | 精品一区二区久久久久久久网站 | 人人看人人做人人澡 | 日本电影久久 | 久草在在线 | 久久免费在线观看 | 蜜臀av性久久久久av蜜臀妖精 | 日韩欧美综合视频 | 五月婷在线视频 | 99在线看 | 亚洲综合在线五月天 | 在线观看视频福利 | 91精品在线免费观看视频 | 91久久偷偷做嫩草影院 | 国产91区| 国产一级免费视频 | 国产在线看 | 色欧美成人精品a∨在线观看 | 久久婷五月 | 99精品欧美一区二区三区黑人哦 | 黄色三级网站在线观看 | 91在线超碰| 中文在线字幕观看电影 | www.看片网站 | 在线亚洲观看 | 久久av网址 | 奇米影视四色8888 | av电影av在线 | 国产精品久久嫩一区二区免费 | 国产人成看黄久久久久久久久 | 人人干人人爽 | 日韩美在线 | 精品久久网 | 一区三区视频在线观看 | 狠狠狠狠狠狠狠狠干 | 午夜国产福利视频 | 国产精品视频在线看 | 热热热热热色 | 日韩欧美一区二区三区视频 | 99久久久免费视频 | 免费看的黄网站软件 | 国产一区视频导航 | 五月天激情综合 | 国产美女视频免费观看的网站 | 国产精品欧美精品 | 日韩在线视频免费播放 | 色妞色视频一区二区三区四区 | 欧美日韩3p | 天天射天天干天天插 | 99视频在线免费看 | 中文字幕在线观看一区二区 | 91精品国产一区二区在线观看 | 怡红院久久 | 国产一级精品在线观看 | 欧美一区二视频在线免费观看 | 国产亚洲情侣一区二区无 | 天堂久久电影网 | 国产精品久久久久久久久久久久冷 | 欧美日韩三级在线观看 | 国产伦理久久精品久久久久_ | 国内久久 | 丁香激情五月 | 日韩精品黄 | 久久伊99综合婷婷久久伊 | 一本一道波多野毛片中文在线 | 日韩超碰 | 欧美日本一区 | 久久免费视频在线观看30 | 麻豆国产精品一区二区三区 | 久久久久国产精品www | 国产精品网红直播 | 亚洲一区二区三区四区精品 | 欧美日韩一区二区在线观看 | 久久久电影网站 | 国产精品久久久久永久免费观看 | 天天色天天操天天爽 | 中文字幕国产精品 | 人人爱人人射 | 91香蕉视频污在线 | 亚洲国产精品一区二区久久hs | 在线精品在线 | 九九久久电影 | 婷婷精品视频 | 中文字幕一区二区三区精华液 | 精品免费视频 | 成年人在线免费看 | 免费污片 | 日韩视频免费 | 亚洲精品高清视频 | 亚洲人久久久 | 久久久一本精品99久久精品66 | 中文字幕一区二区三区久久蜜桃 | 黄av资源| 日韩中文字幕免费视频 | 欧美最猛性xxxxx(亚洲精品) | 成年人在线观看视频免费 | 91在线操 | 青草草在线 | 成片人卡1卡2卡3手机免费看 | 天天爱天天射 | 久久免费公开视频 | 综合色综合 | 亚洲国产精品电影在线观看 | 欧美色图视频一区 | 精品久久免费看 | 亚洲国产精品久久久久久 | 在线日韩一区 | 天天做天天干 | 久久色视频 | 日韩av有码在线 | 天天操天天射天天插 | 国产精品免费观看视频 | 福利一区二区 | 五月开心网 | 精品视频不卡 | 一本一道久久a久久精品 | 日韩高清久久 | 在线观看中文字幕第一页 | 久久99精品国产91久久来源 | 91成人免费在线 | 成人亚洲精品久久久久 | 欧美日韩久久不卡 | 国产一级片免费播放 | 粉嫩av一区二区三区四区在线观看 | 天天色天天操天天爽 | 最新日韩中文字幕 | 午夜视频在线观看欧美 | 国产精品专区h在线观看 | 天天精品视频 | 亚洲精品久久久久58 | 在线91精品 | 狠狠操夜夜 | 亚洲成人av一区 | 精品国产亚洲一区二区麻豆 | 精品亚洲国产视频 | 日本最新一区二区三区 | 草莓视频在线观看免费观看 | 丁香婷婷激情 | 国产一级a毛片视频爆浆 | aaa黄色毛片| jizzjizzjizz亚洲 | 久久久久久蜜桃一区二区 | 在线观看网站你懂的 | 久久久久久网址 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 激情网五月天 | 国产精品夜夜夜一区二区三区尤 | 久久综合九九 | 国产91丝袜在线播放动漫 | 偷拍视频一区 | 国产成人久久av免费高清密臂 | 天天操夜夜爱 | 五月天婷亚洲天综合网精品偷 | 国产色妞影院wwwxxx | 免费亚洲视频在线观看 | 五月婷婷视频在线 | 国精产品999国精产 久久久久 | 日韩1级片 | av成人免费在线观看 | 国产精品va | 亚洲精品在线播放视频 | 中文字幕在线一区二区三区 | 国产一区二区在线影院 | 中文字幕久久精品 | 欧美一区中文字幕 | 视频在线观看国产 | 99精品欧美一区二区三区黑人哦 | 日韩av影片在线观看 | 91麻豆产精品久久久久久 | 婷婷性综合 | 亚洲一本视频 | 国产成人亚洲精品自产在线 | 一区二区理论片 | 韩日精品中文字幕 | 九九热精品视频在线播放 | 精品久久久久久久久久久院品网 | 午夜精品剧场 | 一级国产视频 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 狠狠色狠狠色合久久伊人 | 久久精品国产精品亚洲精品 | 91精品夜夜| 国产视频网站在线观看 | 日韩一级片大全 | 一本一本久久a久久精品牛牛影视 | 久久精品久久久久电影 | 天堂网在线视频 | 欧美性春潮 | 久久精品国产亚洲a | 国产精品成人免费一区久久羞羞 | 十八岁免进欧美 | 免费久久久久久久 | 狠狠的操| 91在线看视频免费 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 在线免费中文字幕 | 香蕉视频免费看 | 99综合久久 | 亚洲乱码在线观看 | 日日干夜夜骑 | 97超级碰碰碰视频在线观看 | 91麻豆精品国产91久久久久久 | 国内精品久久久久国产 | 国产中文字幕在线 | 亚洲视频 视频在线 | 午夜视频在线观看一区二区 | 欧美男同视频网站 | 欧美色精品天天在线观看视频 | 日韩一区二区免费播放 | 国产传媒一区在线 | 天天干天天干天天射 | 中文字幕在线观看的网站 | 久草视频一区 | 亚洲老妇xxxxxx | 日韩在线激情 | 免费高清在线观看成人 | 五月婷婷色播 | 国产 在线 日韩 | 日日夜夜av | 欧美久久久久久久久久 | 日韩在线三区 | 99在线精品免费视频九九视 | 欧美日一级片 | 91成人在线网站 | 亚洲欧美乱综合图片区小说区 | 18+视频网站链接 | 国产午夜精品一区二区三区四区 | 午夜精品久久久久久久久久 | 999国产| 久久综合狠狠综合 | 超碰97人人射妻 | 免费观看www7722午夜电影 | 婷婷国产在线观看 | 欧美性爽爽 | 最近中文字幕国语免费av | 狠狠操夜夜操 | 成人久久18免费网站图片 | 手机在线观看国产精品 | 国产一级免费视频 | 在线播放亚洲激情 | 欧美日在线 | 久久成熟 | 在线中文字幕电影 | 亚洲一区二区天堂 | 亚洲午夜电影网 | 香蕉久草| 欧美成人h版| 蜜桃av观看 | 97人人艹| 一区二区av| 亚洲精品乱码久久久久久久久久 | 欧美尹人| 天天色欧美 | 国产亚洲久一区二区 | 久久精品艹 | 香蕉97视频观看在线观看 | 黄色成人av在线 | 国产网站在线免费观看 | 在线观看欧美成人 | 欧美精品一二三 | 狠狠色综合网站久久久久久久 | 久久艹在线|