色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

Flink Table API 與 SQL 通用概念與 API 完全指南:從 TableEnvironment 到查詢執(zhí)行

Flink Table API 與 SQL 通用概念與 API 完全指南:從 TableEnvironment 到查詢執(zhí)行 大數(shù)據(jù)流處理批處理數(shù)據(jù)工程【免費(fèi)下載鏈接】flink項(xiàng)目地址https://gitcode.com/gh_mirrors/fli/flink點(diǎn)擊查看免費(fèi)下載導(dǎo)讀本文是 Apache Flink 中 Table API 與 SQL 的核心入門與深度指南基于倉庫中的官方文檔 docs/content.zh/docs/dev/table/common.md 展開并結(jié)合flink-table模塊的真實(shí)源碼進(jìn)行佐證。Table API 和 SQL 集成在同一套 API 中其核心概念是Table它同時(shí)充當(dāng)查詢的輸入與輸出。讀完本文你將掌握 Table API/SQL 程序的通用結(jié)構(gòu)、如何創(chuàng)建TableEnvironment、如何在 Catalog 中注冊(cè)臨時(shí)表與永久表、如何用 Table API 和 SQL 兩種方式查詢表、如何將結(jié)果輸出到 TableSink以及查詢的翻譯、優(yōu)化與解釋explain機(jī)制從而能夠獨(dú)立搭建從數(shù)據(jù)源到結(jié)果輸出的完整 Flink 表處理程序。Table API 和 SQL 程序的結(jié)構(gòu)所有用于批處理和流處理的 Table API 和 SQL 程序都遵循相同的模式可概括為五個(gè)步驟創(chuàng)建TableEnvironment→ 創(chuàng)建源表source table→ 創(chuàng)建輸出表sink table→ 通過 Table API 或 SQL 構(gòu)建Table查詢 → 將結(jié)果表輸出到 sink。下面的 Java 示例展示了這一通用結(jié)構(gòu)import org.apache.flink.table.api.*; import org.apache.flink.connector.datagen.table.DataGenConnectorOptions; // Create a TableEnvironment for batch or streaming execution. // See the Create a TableEnvironment section for details. TableEnvironment tableEnv TableEnvironment.create(/*…*/); // Create a source table tableEnv.createTemporaryTable(SourceTable, TableDescriptor.forConnector(datagen) .schema(Schema.newBuilder() .column(f0, DataTypes.STRING()) .build()) .option(DataGenConnectorOptions.ROWS_PER_SECOND, 100L) .build()); // Create a sink table (using SQL DDL) tableEnv.executeSql(CREATE TEMPORARY TABLE SinkTable WITH (connector blackhole) LIKE SourceTable (EXCLUDING OPTIONS) ); // Create a Table object from a Table API query Table table1 tableEnv.from(SourceTable); // Create a Table object from a SQL query Table table2 tableEnv.sqlQuery(SELECT * FROM SourceTable); // Emit a Table API result Table to a TableSink, same for SQL result TableResult tableResult table1.insertInto(SinkTable).execute();對(duì)應(yīng)的 Python 版本使用pyflink.table包通過executeSql創(chuàng)建表、from_path讀取表、sql_query執(zhí)行 SQL、execute_insert輸出結(jié)果from pyflink.table import * # Create a TableEnvironment for batch or streaming execution table_env ... # see Create a TableEnvironment section # Create a source table table_env.executeSql(CREATE TEMPORARY TABLE SourceTable ( f0 STRING ) WITH ( connector datagen, rows-per-second 100 ) ) # Create a sink table table_env.executeSql(CREATE TEMPORARY TABLE SinkTable WITH (connector blackhole) LIKE SourceTable (EXCLUDING OPTIONS) ) # Create a Table from a Table API query table1 table_env.from_path(SourceTable).select(...) # Create a Table from a SQL query table2 table_env.sql_query(SELECT ... FROM SourceTable ...) # Emit a Table API result Table to a TableSink, same for SQL result table_result table1.execute_insert(SinkTable)注意示例中datagen連接器用于無界生成測(cè)試數(shù)據(jù)。其rows-per-second選項(xiàng)在源碼中定義于 DataGenConnectorOptions.java默認(rèn)值為10000行/秒見 DataGenConnectorOptionsUtil.java并支持number-of-rows限定總行數(shù)默認(rèn)無限、無界生成。blackhole連接器則是一個(gè)只接收數(shù)據(jù)、不產(chǎn)生任何輸出的“黑洞” sink非常適合快速驗(yàn)證管線正確性。關(guān)于 Scala所有 Flink Scala API 均已棄用deprecated并將在未來的 Flink 版本中移除。你仍然可以用 Scala 構(gòu)建應(yīng)用但建議遷移到 DataStream 和/或 Table API 的 Java 版本。與 DataStream 的集成Table API 和 SQL 查詢可以很容易地集成并嵌入到 DataStream 程序中。請(qǐng)參閱與 DataStream API 集成章節(jié)了解如何將 DataStream 與表之間的相互轉(zhuǎn)化。創(chuàng)建 TableEnvironmentTableEnvironment是 Table API 和 SQL 的核心概念它負(fù)責(zé)在內(nèi)部的 catalog 中注冊(cè)Table注冊(cè)外部的 catalog加載可插拔模塊modules執(zhí)行 SQL 查詢注冊(cè)自定義函數(shù)scalar、table 或 aggregation 函數(shù)DataStream和Table之間的轉(zhuǎn)換面向StreamTableEnvironmentTable總是與特定的TableEnvironment綁定不能在同一條查詢中使用不同TableEnvironment中的表例如對(duì)它們進(jìn)行 join 或 union 操作。TableEnvironment通過靜態(tài)方法TableEnvironment.create()創(chuàng)建該方法在源碼 TableEnvironment.java 中提供兩種重載接收EnvironmentSettings或直接接收Configuration。最常用的方式是基于EnvironmentSettings指定執(zhí)行模式import org.apache.flink.table.api.EnvironmentSettings; import org.apache.flink.table.api.TableEnvironment; EnvironmentSettings settings EnvironmentSettings .newInstance() .inStreamingMode() // 流處理模式 //.inBatchMode() // 批處理模式 .build(); TableEnvironment tEnv TableEnvironment.create(settings);Python 中通過EnvironmentSettings.in_streaming_mode()和EnvironmentSettings.in_batch_mode()分別創(chuàng)建流式與批式環(huán)境from pyflink.table import EnvironmentSettings, TableEnvironment # create a streaming TableEnvironment env_settings EnvironmentSettings.in_streaming_mode() table_env TableEnvironment.create(env_settings) # create a batch TableEnvironment env_settings EnvironmentSettings.in_batch_mode() table_env TableEnvironment.create(env_settings)兩種模式的選擇決定了查詢語義流式模式以無界數(shù)據(jù)流為輸入、支持窗口與狀態(tài)化聚合批式模式則以有界數(shù)據(jù)集為輸入執(zhí)行與傳統(tǒng)數(shù)據(jù)庫類似的批處理語義。從 StreamExecutionEnvironment 創(chuàng)建 StreamTableEnvironment當(dāng)需要與 DataStream API 互操作時(shí)可以從現(xiàn)有的StreamExecutionEnvironment創(chuàng)建StreamTableEnvironmentimport org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.table.api.EnvironmentSettings; import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tEnv StreamTableEnvironment.create(env);Python 版本同樣支持from pyflink.datastream import StreamExecutionEnvironment from pyflink.table import StreamTableEnvironment s_env StreamExecutionEnvironment.get_execution_environment() t_env StreamTableEnvironment.create(s_env)這樣創(chuàng)建的StreamTableEnvironment既可以通過 Table API/SQL 編寫關(guān)系查詢又可以隨時(shí)將Table與DataStream互相轉(zhuǎn)換實(shí)現(xiàn)關(guān)系查詢與流式算子如 keyBy、map、process的混合編程。在 Catalog 中創(chuàng)建表TableEnvironment維護(hù)著一個(gè)由標(biāo)識(shí)符identifier創(chuàng)建的表 catalog 映射。標(biāo)識(shí)符由三個(gè)部分組成catalog 名稱、數(shù)據(jù)庫名稱以及對(duì)象名稱。如果 catalog 或數(shù)據(jù)庫沒有指明就會(huì)使用當(dāng)前默認(rèn)值參見下文擴(kuò)展表標(biāo)識(shí)符。Table可以是虛擬的視圖VIEWS也可以是常規(guī)的表TABLES視圖VIEWS可以從已經(jīng)存在的Table中創(chuàng)建一般是 Table API 或 SQL 的查詢結(jié)果表TABLES描述的是外部數(shù)據(jù)例如文件、數(shù)據(jù)庫表或消息隊(duì)列。臨時(shí)表Temporary Table和永久表Permanent Table表可以是臨時(shí)的與單個(gè) Flink 會(huì)話session的生命周期相關(guān)也可以是永久的在多個(gè) Flink 會(huì)話和集群cluster中可見。永久表需要 catalog例如 Hive Metastore來維護(hù)表的元數(shù)據(jù)。一旦永久表被創(chuàng)建它將對(duì)任何連接到該 catalog 的 Flink 會(huì)話可見且持續(xù)存在直至被明確刪除。臨時(shí)表通常保存于內(nèi)存中僅在創(chuàng)建它們的 Flink 會(huì)話持續(xù)期間存在對(duì)其它會(huì)話不可見。它們不與任何 catalog 或數(shù)據(jù)庫綁定但可以在一個(gè)命名空間namespace中創(chuàng)建。即使它們對(duì)應(yīng)的數(shù)據(jù)庫被刪除臨時(shí)表也不會(huì)被刪除。屏蔽Shadowing可以使用與已存在的永久表相同的標(biāo)識(shí)符去注冊(cè)臨時(shí)表。此時(shí)臨時(shí)表會(huì)屏蔽永久表并且只要臨時(shí)表存在永久表就無法訪問——所有使用該標(biāo)識(shí)符的查詢都將作用于臨時(shí)表。屏蔽機(jī)制對(duì)實(shí)驗(yàn)experimentation非常有用可以先對(duì)一個(gè)臨時(shí)表執(zhí)行完全相同的查詢例如只包含一個(gè)子集的數(shù)據(jù)或者數(shù)據(jù)是不確定的一旦驗(yàn)證了查詢的正確性就可以對(duì)實(shí)際的生產(chǎn)表進(jìn)行查詢無需修改任何 SQL。創(chuàng)建表虛擬表Virtual Tables在 SQL 的術(shù)語中Table API 的對(duì)象對(duì)應(yīng)于視圖虛擬表。它封裝了一個(gè)邏輯查詢計(jì)劃可以通過以下方式在 catalog 中創(chuàng)建// get a TableEnvironment TableEnvironment tableEnv ...; // see Create a TableEnvironment section // table is the result of a simple projection query Table projTable tableEnv.from(X).select(...); // register the Table projTable as table projectedTable tableEnv.createTemporaryView(projectedTable, projTable);Python 中對(duì)應(yīng)的注冊(cè)方法為register_tableproj_table table_env.from_path(X).select(...) table_env.register_table(projectedTable, proj_table)注意從傳統(tǒng)數(shù)據(jù)庫系統(tǒng)的角度來看Table對(duì)象與VIEW視圖非常像。也就是說定義了Table的查詢沒有被優(yōu)化而且會(huì)被內(nèi)嵌到另一個(gè)引用了這個(gè)注冊(cè)表的查詢中。如果多個(gè)查詢都引用了同一個(gè)注冊(cè)表那么它會(huì)被內(nèi)嵌到每個(gè)查詢中并執(zhí)行多次——注冊(cè)表的結(jié)果不會(huì)被共享。Connector Tables另一種創(chuàng)建TABLE的方式是通過 connector 聲明。Connector 描述了存儲(chǔ)表數(shù)據(jù)的外部系統(tǒng)例如 Apache Kafka 或常規(guī)的文件系統(tǒng)都可以通過這種方式來聲明。這類表既可以通過 Table API 的TableDescriptor直接創(chuàng)建也可以切換到 SQL DDL 創(chuàng)建// Using table descriptors final TableDescriptor sourceDescriptor TableDescriptor.forConnector(datagen) .schema(Schema.newBuilder() .column(f0, DataTypes.STRING()) .build()) .option(DataGenConnectorOptions.ROWS_PER_SECOND, 100L) .build(); tableEnv.createTable(SourceTableA, sourceDescriptor); // 永久表需要 catalog 支持 tableEnv.createTemporaryTable(SourceTableB, sourceDescriptor); // 臨時(shí)表 // Using SQL DDL tableEnv.executeSql(CREATE [TEMPORARY] TABLE MyTable (...) WITH (...));TableDescriptor.forConnector(...)以編程方式構(gòu)建表的連接器類型、schema 與連接選項(xiàng)DataGenConnectorOptions.ROWS_PER_SECOND即源碼中定義的ConfigOption配置鍵rows-per-second使用強(qiáng)類型常量可以避免手寫字符串拼寫錯(cuò)誤。SQL DDL 則提供了與CREATE TABLE一致的聲明式語法二者創(chuàng)建的表可以互換使用。擴(kuò)展表標(biāo)識(shí)符表總是通過三元標(biāo)識(shí)符注冊(cè)包括 catalog 名、數(shù)據(jù)庫名和表名。用戶可以指定一個(gè) catalog 和數(shù)據(jù)庫作為“當(dāng)前 catalog”和“當(dāng)前數(shù)據(jù)庫”這樣三元標(biāo)識(shí)符的前兩個(gè)部分就可以省略未指定時(shí)使用當(dāng)前的 catalog 和當(dāng)前數(shù)據(jù)庫。用戶也可以通過 Table API 或 SQL 切換當(dāng)前的 catalog 和當(dāng)前的數(shù)據(jù)庫。標(biāo)識(shí)符遵循 SQL 標(biāo)準(zhǔn)因此使用時(shí)需要用反引號(hào)進(jìn)行轉(zhuǎn)義。以下 Java 示例演示了不同標(biāo)識(shí)符寫法TableEnvironment tEnv ...; tEnv.useCatalog(custom_catalog); tEnv.useDatabase(custom_database); Table table ...; // register the view named exampleView in the catalog named custom_catalog // in the database named custom_database tableEnv.createTemporaryView(exampleView, table); // register the view named exampleView in the catalog named custom_catalog // in the database named other_database tableEnv.createTemporaryView(other_database.exampleView, table); // register the view named example.View in the catalog named custom_catalog // in the database named custom_database tableEnv.createTemporaryView(example.View, table); // register the view named exampleView in the catalog named other_catalog // in the database named other_database tableEnv.createTemporaryView(other_catalog.other_database.exampleView, table);從源碼接口看useCatalog(String)與useDatabase(String)均定義于 TableEnvironment.java 的TableEnvironment接口中是切換當(dāng)前命名空間的官方 API。Python 中對(duì)應(yīng)為use_catalog(...)與use_database(...)注冊(cè)方法為create_temporary_view(...)。查詢表Table APITable API 是關(guān)于 Java 和 Scala 的集成語言式查詢 API。與 SQL 相反Table API 的查詢不是由字符串指定而是在宿主語言中逐步構(gòu)建。Table API 基于Table類該類表示一個(gè)表流或批處理并提供使用關(guān)系操作的方法。這些方法返回一個(gè)新的Table對(duì)象該對(duì)象表示對(duì)輸入 Table 進(jìn)行關(guān)系操作的結(jié)果。一些關(guān)系操作由多個(gè)方法調(diào)用組成例如table.groupBy(...).select(...)其中g(shù)roupBy(...)指定table的分組而select(...)是在分組上的投影。文檔 Table API 說明了所有流處理和批處理表支持的 Table API 算子。以下示例展示了一個(gè)簡(jiǎn)單的 Table API 聚合查詢——計(jì)算法國所有客戶的收入// get a TableEnvironment TableEnvironment tableEnv ...; // see Create a TableEnvironment section // register Orders table // scan registered Orders table Table orders tableEnv.from(Orders); // compute revenue for all customers from France Table revenue orders .filter($(cCountry).isEqual(FRANCE)) .groupBy($(cID), $(cName)) .select($(cID), $(cName), $(revenue).sum().as(revSum)); // emit or convert Table // execute queryPython 版本使用col(...)引用列orders table_env.from_path(Orders) revenue orders \ .filter(col(cCountry) FRANCE) \ .group_by(col(cID), col(cName)) \ .select(col(cID), col(cName), col(revenue).sum.alias(revSum))注意$(...)是基于字符串的表達(dá)式引用fromDataStream轉(zhuǎn)換或已有表均可使用filter/groupBy/select等算子都返回新的Table因而可以無限鏈?zhǔn)浇M合。SQLFlink SQL 是基于實(shí)現(xiàn)了 SQL 標(biāo)準(zhǔn)的 Apache Calcite 描述了 Flink 對(duì)流處理和批處理表的 SQL 支持。下面的示例演示了如何指定查詢并將結(jié)果作為Table對(duì)象返回// get a TableEnvironment TableEnvironment tableEnv ...; // see Create a TableEnvironment section // register Orders table // compute revenue for all customers from France Table revenue tableEnv.sqlQuery( SELECT cID, cName, SUM(revenue) AS revSum FROM Orders WHERE cCountry FRANCE GROUP BY cID, cName ); // emit or convert Table // execute query如下示例展示了如何指定一個(gè)更新查詢insert query將查詢的結(jié)果插入到已注冊(cè)的表中// get a TableEnvironment TableEnvironment tableEnv ...; // see Create a TableEnvironment section // register Orders table // register RevenueFrance output table // compute revenue for all customers from France and emit to RevenueFrance tableEnv.executeSql( INSERT INTO RevenueFrance SELECT cID, cName, SUM(revenue) AS revSum FROM Orders WHERE cCountry FRANCE GROUP BY cID, cName );Python 對(duì)應(yīng)為sql_query(...)與execute_sql(...)。可以看到sqlQuery用于讀取返回Table對(duì)象而executeSql用于執(zhí)行 DDL/DML如CREATE TABLE、INSERT INTO這是兩者在用法上的關(guān)鍵區(qū)別?;煊?Table API 和 SQLTable API 和 SQL 查詢的混用非常簡(jiǎn)單因?yàn)樗鼈兌挤祷豑able對(duì)象可以在 SQL 查詢返回的Table對(duì)象上定義 Table API 查詢?cè)赥ableEnvironment中注冊(cè)的結(jié)果表可以在 SQL 查詢的FROM子句中引用通過這種方法就可以在 Table API 查詢的結(jié)果上定義 SQL 查詢。輸出表Table通過寫入TableSink輸出。TableSink是一個(gè)通用接口用于支持多種文件格式如 CSV、Apache Parquet、Apache Avro、存儲(chǔ)系統(tǒng)如 JDBC、Apache HBase、Apache Cassandra、Elasticsearch或消息隊(duì)列系統(tǒng)如 Apache Kafka、RabbitMQ。批處理Table只能寫入BatchTableSink流處理Table需要指定寫入AppendStreamTableSink、RetractStreamTableSink或UpsertStreamTableSink之一取決于結(jié)果流的更新模式。請(qǐng)參考文檔 Table Sources Sinks 獲取更多關(guān)于可用 Sink 的信息以及如何自定義DynamicTableSink。方法Table.insertInto(String tableName)定義了一個(gè)完整的端到端管道將源表中的數(shù)據(jù)傳輸?shù)揭粋€(gè)被注冊(cè)的輸出表中。該方法通過名稱在 catalog 中查找輸出表并確認(rèn)Tableschema 與輸出表 schema 一致。從源碼看insertInto返回TablePipeline對(duì)象見 Table.java可以通過TablePipeline.explain()和TablePipeline.execute()分別解釋和執(zhí)行一個(gè)數(shù)據(jù)流管道。下面的示例演示如何輸出Table其中輸出表使用filesystem連接器 CSV 格式并以|作為字段分隔符// get a TableEnvironment TableEnvironment tableEnv ...; // see Create a TableEnvironment section // create an output Table final Schema schema Schema.newBuilder() .column(a, DataTypes.INT()) .column(b, DataTypes.STRING()) .column(c, DataTypes.BIGINT()) .build(); tableEnv.createTemporaryTable(CsvSinkTable, TableDescriptor.forConnector(filesystem) .schema(schema) .option(path, /path/to/file) .format(FormatDescriptor.forFormat(csv) .option(field-delimiter, |) .build()) .build()); // compute a result Table using Table API operators and/or SQL queries Table result ...; // Prepare the insert into pipeline TablePipeline pipeline result.insertInto(CsvSinkTable); // Print explain details pipeline.printExplain(); // emit the result Table to the registered TableSink pipeline.execute();Python 中直接通過result.execute_insert(CsvSinkTable)一步完成插入與執(zhí)行。這里體現(xiàn)了 sink 管道的兩個(gè)階段insertInto只是準(zhǔn)備構(gòu)建TablePipeline可先行printExplain()檢查執(zhí)行計(jì)劃真正觸發(fā)執(zhí)行的是pipeline.execute()。翻譯與執(zhí)行查詢不論輸入數(shù)據(jù)源是流式的還是批式的Table API 和 SQL 查詢都會(huì)被轉(zhuǎn)換成 DataStream 程序。查詢?cè)趦?nèi)部表示為邏輯查詢計(jì)劃并被翻譯成兩個(gè)階段優(yōu)化邏輯執(zhí)行計(jì)劃翻譯成 DataStream 程序Table API 或 SQL 查詢?cè)谙铝星闆r下會(huì)被翻譯TableEnvironment.executeSql()被調(diào)用時(shí)用于執(zhí)行一條 SQL 語句一旦被調(diào)用SQL 語句立即被翻譯TablePipeline.execute()被調(diào)用時(shí)用于執(zhí)行一個(gè)源表到輸出表的數(shù)據(jù)流一旦被調(diào)用Table API 程序立即被翻譯Table.execute()被調(diào)用時(shí)用于將一個(gè)表的內(nèi)容收集到本地一旦被調(diào)用Table API 程序立即被翻譯StatementSet.execute()被調(diào)用時(shí)TablePipeline通過StatementSet.add()輸出給某個(gè) Sink和 INSERT 語句通過調(diào)用StatementSet.addInsertSql()會(huì)先被緩存到StatementSet中當(dāng)StatementSet.execute()被調(diào)用時(shí)所有的 sink 會(huì)被優(yōu)化成一張有向無環(huán)圖DAG從而共享公共子計(jì)劃、避免重復(fù)計(jì)算Table被轉(zhuǎn)換成DataStream時(shí)參閱與 DataStream 集成轉(zhuǎn)換完成后它就成為一個(gè)普通的 DataStream 程序并會(huì)在調(diào)用StreamExecutionEnvironment.execute()時(shí)被執(zhí)行。StatementSet由TableEnvironment.createStatementSet()創(chuàng)建接口定義見 TableEnvironment.java適合在一條作業(yè)中批量提交多個(gè) sink 的場(chǎng)景。查詢優(yōu)化Apache Flink 使用并擴(kuò)展了 Apache Calcite 來執(zhí)行復(fù)雜的查詢優(yōu)化包括一系列基于規(guī)則和基于成本的優(yōu)化例如基于 Apache Calcite 的子查詢解相關(guān)subquery decorrelation投影剪裁projection pruning分區(qū)剪裁partition pruning過濾器下推filter push-down子計(jì)劃消除重復(fù)數(shù)據(jù)以避免重復(fù)計(jì)算特殊子查詢重寫包括兩部分將IN和EXISTS轉(zhuǎn)換為 left semi-joins將NOT IN和NOT EXISTS轉(zhuǎn)換為 left anti-join可選 join 重新排序通過table.optimizer.join-reorder-enabled配置啟用注意當(dāng)前僅在子查詢重寫的結(jié)合條件下支持IN/EXISTS/NOT IN/NOT EXISTS。優(yōu)化器不僅基于計(jì)劃還基于可從數(shù)據(jù)源獲得的豐富統(tǒng)計(jì)信息以及每個(gè)算子例如 io、cpu、網(wǎng)絡(luò)和內(nèi)存的細(xì)粒度成本來做出明智的決策。高級(jí)用戶可以通過CalciteConfig對(duì)象提供自定義優(yōu)化通過調(diào)用TableEnvironment#getConfig#setPlannerConfig將其提供給 TableEnvironment。解釋表ExplainTable API 提供了一種機(jī)制來解釋計(jì)算Table的邏輯和優(yōu)化查詢計(jì)劃。這是通過Table.explain()方法或者StatementSet.explain()方法完成的Table.explain()返回一個(gè)Table的計(jì)劃StatementSet.explain()返回多 sink 計(jì)劃的結(jié)果。它們返回一個(gè)描述三種計(jì)劃的字符串關(guān)系查詢的抽象語法樹the Abstract Syntax Tree即未優(yōu)化的邏輯查詢計(jì)劃優(yōu)化的邏輯查詢計(jì)劃物理執(zhí)行計(jì)劃。此外可以用TableEnvironment.explainSql()方法和TableEnvironment.executeSql()方法支持執(zhí)行一個(gè)EXPLAIN語句獲取邏輯和優(yōu)化查詢計(jì)劃請(qǐng)參閱 EXPLAIN 頁面。以下代碼展示了給定Table使用Table.explain()的示例StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tEnv StreamTableEnvironment.create(env); DataStreamTuple2Integer, String stream1 env.fromElements(new Tuple2(1, hello)); DataStreamTuple2Integer, String stream2 env.fromElements(new Tuple2(1, hello)); // explain Table API Table table1 tEnv.fromDataStream(stream1, $(count), $(word)); Table table2 tEnv.fromDataStream(stream2, $(count), $(word)); Table table table1 .where($(word).like(F%)) .unionAll(table2); System.out.println(table.explain());上述例子的輸出 Abstract Syntax Tree LogicalUnion(all[true]) :- LogicalFilter(condition[LIKE($1, _UTF-16LEF%)]) : - LogicalTableScan(table[[Unregistered_DataStream_1]]) - LogicalTableScan(table[[Unregistered_DataStream_2]]) Optimized Physical Plan Union(all[true], union[count, word]) :- Calc(select[count, word], where[LIKE(word, _UTF-16LEF%)]) : - DataStreamScan(table[[Unregistered_DataStream_1]], fields[count, word]) - DataStreamScan(table[[Unregistered_DataStream_2]], fields[count, word]) Optimized Execution Plan Union(all[true], union[count, word]) :- Calc(select[count, word], where[LIKE(word, _UTF-16LEF%)]) : - DataStreamScan(table[[Unregistered_DataStream_1]], fields[count, word]) - DataStreamScan(table[[Unregistered_DataStream_2]], fields[count, word])可以看到AST 階段展示的是未經(jīng)優(yōu)化的邏輯算子LogicalUnion、LogicalFilter、LogicalTableScan優(yōu)化后的物理計(jì)劃中LIKE過濾條件已經(jīng)被下推進(jìn)Calc算子執(zhí)行計(jì)劃則給出了最終可執(zhí)行的算子拓?fù)?。explain是排查查詢語義與優(yōu)化效果最直接的工具。多 sink 計(jì)劃的解釋當(dāng)使用StatementSet提交多個(gè) sink 時(shí)可以用StatementSet.explain()觀察多 sink 計(jì)劃——所有 sink 被優(yōu)化成一張有向無環(huán)圖公共子計(jì)劃會(huì)被復(fù)用。以下 Java 示例定義了兩個(gè)文件源和兩個(gè)文件 sinkEnvironmentSettings settings EnvironmentSettings.inStreamingMode(); TableEnvironment tEnv TableEnvironment.create(settings); final Schema schema Schema.newBuilder() .column(count, DataTypes.INT()) .column(word, DataTypes.STRING()) .build(); tEnv.createTemporaryTable(MySource1, TableDescriptor.forConnector(filesystem) .schema(schema) .option(path, /source/path1) .format(csv) .build()); tEnv.createTemporaryTable(MySource2, TableDescriptor.forConnector(filesystem) .schema(schema) .option(path, /source/path2) .format(csv) .build()); tEnv.createTemporaryTable(MySink1, TableDescriptor.forConnector(filesystem) .schema(schema) .option(path, /sink/path1) .format(csv) .build()); tEnv.createTemporaryTable(MySink2, TableDescriptor.forConnector(filesystem) .schema(schema) .option(path, /sink/path2) .format(csv) .build()); StatementSet stmtSet tEnv.createStatementSet(); Table table1 tEnv.from(MySource1).where($(word).like(F%)); stmtSet.add(table1.insertInto(MySink1)); Table table2 table1.unionAll(tEnv.from(MySource2)); stmtSet.add(table2.insertInto(MySink2)); String explanation stmtSet.explain(); System.out.println(explanation);Python 中對(duì)應(yīng)為create_statement_set()、stmt_set.add_insert(MySink1, table1)與stmt_set.explain()。多 sink 計(jì)劃的輸出節(jié)選 Abstract Syntax Tree LogicalLegacySink(name[default_catalog.default_database.MySink1], fields[count, word]) - LogicalFilter(condition[LIKE($1, _UTF-16LEF%)]) - LogicalTableScan(table[[default_catalog, default_database, MySource1, source: [CsvTableSource(read fields: count, word)]]]) LogicalLegacySink(name[default_catalog.default_database.MySink2], fields[count, word]) - LogicalUnion(all[true]) :- LogicalFilter(condition[LIKE($1, _UTF-16LEF%)]) : - LogicalTableScan(table[[default_catalog, default_database, MySource1, source: [CsvTableSource(read fields: count, word)]]]) - LogicalTableScan(table[[default_catalog, default_database, MySource2, source: [CsvTableSource(read fields: count, word)]]]) Optimized Physical Plan LegacySink(name[default_catalog.default_database.MySink1], fields[count, word]) - Calc(select[count, word], where[LIKE(word, _UTF-16LEF%)]) - LegacyTableSourceScan(table[[default_catalog, default_database, MySource1, source: [CsvTableSource(read fields: count, word)]]], fields[count, word]) LegacySink(name[default_catalog.default_database.MySink2], fields[count, word]) - Union(all[true], union[count, word]) :- Calc(select[count, word], where[LIKE(word, _UTF-16LEF%)]) : - LegacyTableSourceScan(table[[default_catalog, default_database, MySource1, source: [CsvTableSource(read fields: count, word)]]], fields[count, word]) - LegacyTableSourceScan(table[[default_catalog, default_database, MySource2, source: [CsvTableSource(read fields: count, word)]]], fields[count, word]) Optimized Execution Plan Calc(select[count, word], where[LIKE(word, _UTF-16LEF%)])(reuse_id[1]) - LegacyTableSourceScan(table[[default_catalog, default_database, MySource1, source: [CsvTableSource(read fields: count, word)]]], fields[count, word]) LegacySink(name[default_catalog.default_database.MySink1], fields[count, word]) - Reused(reference_id[1]) LegacySink(name[default_catalog.default_database.MySink2], fields[count, word]) - Union(all[true], union[count, word]) :- Reused(reference_id[1]) - LegacyTableSourceScan(table[[default_catalog, default_database, MySource2, source: [CsvTableSource(read fields: count, word)]]], fields[count, word])注意執(zhí)行計(jì)劃中的reuse_id[1]與Reused(reference_id[1])由于MySink1與MySink2都引用了對(duì)MySource1的相同過濾查詢StatementSet優(yōu)化器將其識(shí)別為公共子計(jì)劃并復(fù)用避免了同一份Calc計(jì)算被重復(fù)執(zhí)行——這正是StatementSet相比多次單獨(dú)executeSql的核心優(yōu)勢(shì)之一??偨Y(jié)圍繞Table這一核心概念Flink Table API 與 SQL 形成了完整一致的編程模型通過TableEnvironment統(tǒng)一管理 catalog、模塊與函數(shù)注冊(cè)通過臨時(shí)/永久表、虛擬視圖與 connector 表三種形態(tài)描述數(shù)據(jù)以 Table API 或 SQL 兩種等價(jià)方式構(gòu)建查詢經(jīng)insertInto/TablePipeline將結(jié)果輸出到 sink最終由基于 Calcite 的優(yōu)化器完成兩階段翻譯與優(yōu)化并在Table.execute()、TablePipeline.execute()、StatementSet.execute()等觸發(fā)點(diǎn)真正執(zhí)行。explain機(jī)制則為調(diào)試與優(yōu)化提供了從 AST 到物理執(zhí)行計(jì)劃的全程可視化。本文所涉及的源碼證據(jù)均可在倉庫flink-table與flink-connectors模塊中找到讀者可結(jié)合 docs/content.zh/docs/dev/table/tableApi.md、docs/content.zh/docs/dev/table/sql/overview.md 與 docs/content.zh/docs/dev/table/catalogs.md 繼續(xù)深入。贊分享大數(shù)據(jù)流處理批處理數(shù)據(jù)工程【免費(fèi)下載鏈接】flink項(xiàng)目地址https://gitcode.com/gh_mirrors/fli/flink點(diǎn)擊查看免費(fèi)下載相關(guān)推薦終極百度貼吧個(gè)性化體驗(yàn)指南TiebaTS模塊完全解析終極百度貼吧個(gè)性化體驗(yàn)指南TiebaTS模塊完全解析 TiebaTS是一款基于Xposed框架的開源百度貼吧增強(qiáng)模塊專為追求純凈、高效貼吧瀏覽體驗(yàn)的用戶設(shè)計(jì)后端運(yùn)維觀測(cè)告警可觀測(cè)性人工智能AI Agent3個(gè)核心策略深度優(yōu)化MediaPipe GPU性能的完整指南3個(gè)核心策略深度優(yōu)化MediaPipe GPU性能的完整指南 MediaPipe作為跨平臺(tái)的機(jī)器學(xué)習(xí)框架為實(shí)時(shí)媒體處理提供了強(qiáng)大的GPU加速能力。在追求極致人工智能機(jī)器學(xué)習(xí)計(jì)算機(jī)視覺多模態(tài)本地部署Flink SQL JSON完全指南從解析到嵌套查詢實(shí)戰(zhàn)Flink SQL JSON完全指南從解析到嵌套查詢實(shí)戰(zhàn) 你是否還在為JSON數(shù)據(jù)解析頭疼面對(duì)多層嵌套結(jié)構(gòu)無從下手本文將帶你掌握Apache Flink大數(shù)據(jù)流處理批處理數(shù)據(jù)工程上一篇Vue Router 導(dǎo)航故障Navigation Failures完全指南檢測(cè)、分類與實(shí)戰(zhàn)處理下一篇從惱人廣告到絲滑觀看Improve YouTube! 擴(kuò)展的六種打開方式創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
中文字幕精品一区二区精| 夜间福利片1000无码| 一个人在线看的黄色电影网站| 日韩97| 亚洲精品一区二区免费在线观看| 丁香六月婷婷久久综合| 天天色天天干天天射| 人妻精品一区二区| 97超碰欧美| 国内精品久9| 欧美狠狠弄| 五月婷婷激情| 婷婷伊人| 99热精品在线观看| 亚洲无码99| 东亚亚洲无码高清| 偷看洗澡一二三区美女| 国产精品麻豆视频网站| 大香蕉视频一二三区| 超碰97 线线 在现| 大香蕉淫人| 亚洲se电影| 色呦呦、国产精品| 草久久久| www.色五月| 人人摸.人人色| 99热这里只有精品18| 99re6国产精品99re| 97色在线观看| 国产欧美伊人| 91天天日| 国产精品国产自产拍高清AV| 狠狠中文字幕| 欧美极品女人的天堂| 亚洲熟妇自偷自拍另欧美| 精品国产乱码久久久久久口爆网站 | 亚洲人久久久网| 91九久| laoshunv91| 无码视频一区二区| 日韩天天综合| 国产97在线视频| 翔田千里爆乳巨臀无码| 国产一区二区在线播放量| 青草成人免费视频一com| 国产精品日日摸天天碰| 91久久婷婷| 久久日本熟妇熟色一区| 超碰色男人操熟女| 久久精品国产免费观看99| 无码日韩网站| 一二三区在线| 四虎国产成人精品免费一女五男| 妇女乱色二区| 美女久久久久久久久久久| 黄页av| 亚洲色婷婷久久91| 中国国产精品一区视频| www久久99| 久操婷婷| 成人久久精品| 亚洲无码精品AV久久久| 九九无码视频| 嗯嗯嗯不要不要免费视频| 亚洲大色堂| 中文字幕88av在线| av无线看| 欧美一品道| 婷婷综合网站| 日韩欧亚中文在线| 亚洲AV免费在线| 久久久五月天| 女上位精品在线| 96一区二区| 在线播放一级无码视频| 婷婷久久综合| 色狠狠一区二区三区香蕉| 欧在线一二区| 久久久久成人亚洲国产| 日韩免费人妻色情网站| 亚洲drav色图| 探花精品 一区二区| 日韩欧美aⅴ综合网站发布| 丁香五月大香蕉| 久久久久9久久久久| 国产成人bd在线观看| 操逼精品视频| 国产农村妇女精品| 久久精品国产亚洲AV无码电影| 久久久一区二区三区四曲免费听| 蜜臀th| 夜夜嗨一区| 男人的天堂 在线一区| 国产日韩在线播放| 女人香蕉久久毛毛片精品| 综合伊人激情| 裸体美女国产免费久久久网站| 日韩一999精品| 日韩精品三级| 国产精品老师| 韩国毛片一区二区三区| 香蕉热人人精品| 夜夜操天| 神马麻豆福利院 | 91超级碰| 自拍第一页| 大学生口爆吞精| 一区二区三区男女操逼黄色小电影| 就去色综合| 免费看国产曰批40分钟怎么下载| 久久久久久久久久久97| 97干色| 久久性视频| 热热色国产一二区AV| www.91理论| 97香蕉人人乳| 日本东京热加勒比久久| 国产精品视频播放| 午夜操逼不卡| 日韩97视频| 老司机天天操| 中文在线视频| 国语国产操逼伊人AV网| 欧美在线视频观看一二三四区高清| 蜜乳AV免费观看| 大香蕉在线视频15| 日本三级一区二区 在线| 激情图片亚洲色图| 另类小说综合网| 夜夜久久| 国产h片在线观看视频| 97欧美色资源| 91五月天| ?亚洲伊人伊成久久人综合网| 亚洲91网站| 嫩草美女久久| 99久久久无码精品国产人| 亚洲色图 欧美热图 清纯唯美 另类自拍| 人妻娇喘 激情视频| 九九色综合| 亚洲加勒比| 天美一二三在线观看Av| 欧美色性爱| 中文字幕av一区二区三区人妻少妇| 久久久婷婷| 亚洲久久久久| 亚洲精品一区二区免费在线观看| 国产懂色精品国产av| 欧美九一精品久久久熟妇| 91久久久久久久久18| 男人在线天堂| 超碰在97| 丰满少妇人妻久久久久久| 五十路六十路素人熟女| 精品欧美日韩在线观看| 中文字幕啊啊啊在线观看视频| 无码一区免费在线不卡| 神马久久久久久久久| 日本免费中文一区二区三区四区 | 国产精品自在自拍视频| 亚洲色图欧洲| 久久亚码| 后入式在线免费观看60秒| 五月丁香色色网| 天天综合网网欲色| 极品一区二区三区免费| 国产精品小视频一区二区三区| 免费公开人人操| 美女91网址| 人妻一区二区三区| 日韩av乱伦| 国产精品麻豆成人av| 亚洲黄色网址视频| 中文字幕高清精品一区| 亚洲天堂另类| 九月伊人中文字幕| www欧美91| 久久AV无码1区2区3区| 久久久久国产一区二| 青娱乐福利99| 日韩综合色图| 色色色日本| 性欧美91| 一起草高清无码| 青青草色AV| 色眯眯av| 亚洲在高跟鞋自慰久久在色线| 一区二区三区视频| 99热综合| 久久久97| 亚洲欧美中文日韩视频中国语| 人妻性爱一区二区| 夜色91| 亚洲第二页| 欧美国产有色电影| 欧美亚州色的图| 极品白嫩福利在线| 欧美最婬乱婬爆婬性视频 | 欧美黄色手机在线观看| 思思热在线视频免费| 欧美日韩1234| 蜜乳AV免费观看| 欧美天天射| 欧美色乱| 少妇久久久久久| 久热最新在线杭州| 91日韩国产欧美亚洲另类精盘州至城都| 特级毛片特黄久久免费看| 性感女人网页在线观看视频| 欧美.亚洲.另类.丝袜.制服.诱惑| 99999久久久久9国产精品| 色色色色电影网| 色色婷婷丁香| 国产精品久久aV| 日本精品一区二区三| 亚洲情色一区二区三区| 久伊人网78| 97视频免费播放| 97免费在线| 啊啊啊啊啊啊好多水| 国产强奸乱伦第1页| 国产深喉视频一区二区| 最近2018中文字幕在线高清第一页| 日韩肏逼视频| A级片日韩欧美国产欧美视频精选观看| 美女久久久| 久久国产乱子伦精品免费女,网站| 夜夜欧美 | 91女色| 亚洲图片欧美色| 日韩免费三级黄片电影| japan日本高清乱xxxx| 国内自拍 日韩激情 99| 国产精品交换一区二区| 人妻插插人妻人| AV高清一区| 久久人人爽av亚洲精品天堂桃色 | www激情| 98色网| 亚洲情色在线| 欧美在线天堂| 国产女同视频在线播放| 久热91| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 久久免费老司机精品| 国产农村妇女精品一二区| 亚洲999综合| 夜夜躁狠狠躁日日躁av| 欧美性爱一级操| 亚州精品一区二区三区香中文字幕在线| 久久精品免费| 天天躁日日躁狠狠狠躁| 污污汅18禁网站在线永久免费观看 | 激情文学网伊人| 青久操| 亚洲资源一区| 在线观看日韩av不卡| 91肏屄网| 99久久99九九99九九九| 久久高清欧美国产| 亚洲 欧美 综合 91| 超碰97色| av中文在线| 啊啊啊啊二区好大| 中文字幕99999| 成人亚欧免费视频| 亚洲网污污污污| 91亚洲网| 日韩三级视频一区二区三区| 精品中文日韩字幕视频| yaouchengrenav| 狠狠激情综合狠狠操中文字幕| 成人日韩中文字幕| 日日操夜夜操天天操免费观看麻豆| 人人玩人人添人人澡免费| 亚洲中文字幕噜噜噜久久久| 人人妻人人色一区二区三区| 久久综合资源一区二区| 极品内射| 北约熟女超碰| 91最新综合| 亚洲无码com| 色欲久久综合| 88在线一区二区三区| www.伪伪| 2017天天透天天通天天擦| 91久久九九精品国产综合| 久久婷婷一区二| 精品女同一区二区三区| 日本熟妇人妻中出视频| 黄色工厂这里只有精品| 婷婷伊人綜合中文字幕| 99操逼| 国产精品久久久三级无码| 97超碰中文| 99国产在线 精品 视频| 亚洲日韩东京热一区| 免费一级性爱久久| 亚洲人码13| blacked精品一区国产| 99后入| 国产精品探花视频| 欧美精品亚洲精品日韩传电影| 久久国产乱子伦精品免费女人| 欧美综合制服在线| 99天堂网| 99re这里只有精品9| 亚洲s在线观看| 老熟女乱伦一区| 五十路熟女工口 | 歐美性天天| 亚洲成人一区二区精品| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 免费αV在线视频| 久插综合| 国产激情在线| 夜色综合| 中文字幕文字幕无码一区二区三区电影99| 色色香蕉| 超碰欧美COM| 久久亚洲不卡| 天天爱天天韩国日本牛牛牛牛| 国产操操日韩三级黄| 久久九九视频九九视频| 中韩中文字幕在线观看| 国产日韩精品一区二区三区| 超碰人人操97碰| 日本高清视频在线观看黄已三辽| 91美腿丝袜在线观看| 亚洲欧洲中文日韩女优乱码| 国产美女高潮视频| 精品国产乱码久久久兰草影视| 成人亚欧免费视频| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 99热 按摩 日韩| 色综合色欲色综合色综合色综合| 久久精品国产亚洲5555| 9 9无尺码天堂网| 久久精彩视频| 国产高清在线观看欧美| 一级aaaaa欧美中文字幕录像片| 强歼乱伦资源网| 综合亚洲网| 欧美美女在线高潮999| 欧美大香蕉专区网| 中文字幕黄片在线| 男人综合网| 青青伊人久久| 国产伦精品免编号公布| av日韩在线观看电影| 人妻久久一区二区三区| 精品人妻一区二区蜜桃视频| 偷拍亚洲高清图片| 日日夜夜狠狠| 亚洲精品精品一区二区| 日本 色 导航| 伊人影院日本| 亚洲精品久久久久毛片A片拉屎 | 久久久久久性爱视频| HEYZO高无码国产精品227| 91内射| 精品国产a∨一区天美传媒| 欧美亚洲美少妇一区二区| 精品一区二区3区| 五月婷婷色| 色牛牛AV| 中文字幕jul-617人妻熟女| 中文字幕一二区二三区人妻专区| 久久精品国产99精品亚洲蜜... | 大香蕉 222| 婷色五月天| 在线观看国产黄色| 欧美日韩国产色图在线| 日韩亚洲国产视频| 久干9操| 人妻一二三区| 色网在线视频观看免费| 操逼视频色| 99精品人人爽| 日韩AC| 人妻丝袜二区| 78操B| 午夜欧美精品久久久| 91网站在线播放| 欧美国产操逼| 欧美日韩国产色五月综合在线| 夜夜操一区二区| 黄呦呦在线| 性色中出| 欧美在线色| 国产精品一区二区久久精品| 色在线综合| 色综合国产在线观看| 久久精品国产亚洲AV先锋| 黑人精品成人一区二区三区 | 天天亚洲综合| 欧美 亚洲 大香| 四虎免费看黄| 老女人老91妇女老热女| 国产精品久久久久久9999| 色天堂在线观看| 青青草国产一区二区三区| 欧美日韩亚洲少妇寂寞影院正在播放| 九九草| 日韩字幕一区| 日本天天操| 中文字幕在线观看二区三区| 97色伦欧美| 日日骚 av| 欧美激情黑人| 蜜臀久久99精品久久久久久-DVD| 97超碰人人模人人拍人人| 亚洲97成人在线观看| 隔壁邻居波多野结衣中文字幕| 久久av一级av少妇av高潮| 久久久久久九九九九| 五月香婷婷| 欧美白嫩在线放| 超碰久久草| 老鸭窝成人| 97视频网站| 无码高清国产AV| 97任你吞精| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 亚洲欧洲av影音| 日韩欧美中文日韩欧美色| 精品国产精品一区二区| 高树玛利亚无码流出| 伊人精品国产| 乱伦熟妇一区二区| 九色视频91| 成人色女网| 欧美天天搞| 欧美一级欧美三级在线观看 | 91干熟女| 久草婷婷| 欧美激情综合| 大香蕉九九| 蜜桃色院一区久久| 亚洲无992tv| 亚欧国产无码精品在线| 自拍视频大全亚洲专媒视频/一区二区三区| 最新9久久久9免费视频| 久久受www免费人成| 五月天社区| 欧美综合网1| 69av一区二区三区| 国产九月婷婷| 欧美亚洲特P| 国产精品一级特黄aaa大片在线观看| 99re这里只有精品中心播放| 97人人爱人人乐| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 欧美日韩一区二区三区四区蜜桃| 日本丝袜美腿人妻九九| 伊人网av| 久久性生大片免费观看性| 欧美一区二区观看在线| 青青草在线视频欧美| 免费视频97| 激情接吻视频久久久久久| 97超碰免费人人性爱| 亚洲熟妇一,二,三期| 嗯啊不要在线| 九九九九精品精| 97超碰精品图片| 在现视频女上位好爽| 欧美激情亚洲情色| 欧美性爱日韩高清| 秋霞午夜成人福利片片| 欧美日韩国产另类综合| 囯戸精品高潮呻吟旡码| 麻豆AV96熟妇人妻| 日本熟女不卡视频| 一区二区三区国产精产| AV乱伦专区| 国产精品久久久久久夜夜夜| 国产精品又黄又猛又粗| 一区| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 久久伊人在线五区| 久久成人国产精品| 亚洲老司机123专区| 国产精品蜜臀久久久久无码AV| 蜜桃视频精品一区二区三区| 国产日韩色综合| 亚洲污污网站| 亚洲综合一区二区| 精品无人区麻豆乱码1区2区图片| 天天超级碰碰碰| 精品九区| 国产60区。| 欧美性爱第一区| 色九九综合AV| 色色五月婷婷| 精品久久久av无码免费| 日欧毛片久久| 中文字幕一区日韩精| 国产三级片在线观看| 啊啊啊啊免费视频| 精品少妇一区二区三区免费观看| 久久久久大香青草精品综合| 欧美精品庄| 天天干天天舔| 97网址97| www.99色| 久久av无码| 加勒比综合a∨| 五月天精品| 九九精品99| 青娱乐 青青青操 日逼| 欧美天天综| 探花激情视频| 天天躁日日躁成人字幕aⅴ| AV色五月天| 欧美大香蕉在线观看| 91成人久久| 国产精品白丝| 综合欧美色图| 天天草天天日| 嗯嗯啊啊的视频| 玖玖人人爱| 加勒比在线视频一区二区三区| 欧美性暴力| 欧美韩日精品资源| 欧美日韩电影一区二区| 五月婷婷激情网| 麻花豆传媒剧国产MV出差| 99热这里只有精品18| 天综合网欧美| 成人综合视频久久| 亚洲国产欧美日韩人妻日中文| 天天视频综合在线观看视频| 久久草草亚洲蜜桃臀| 96久久久久久久| 亚av顶级裸体一区二区三区四区五区| 久久精精区一区二区一蜜桃一区二区| 黄色AAAAAAAAAAA大片| 男女啪啪网站免费视频| 中文字幕激情小说| 色综九九九一区| 综合天天网| 啊啊啊操死我了| Sekablack无码一区| 欧美综合中文| 97伊人超碰| 一区二区三区国产在线播放| 久热色情精品| 天天干天天干天天干| A片 AV一级在线播放观看免费 | 日韩性爱毛片操骚逼| 人人操人人色网| 97视频免费播放| 大逼色网站| 青青草一本道福利视频| 97久久久久久久久久| 99久在线精品99re8热视频在线| 亚洲瓯美色图| 激情露脸爱| 欧美日韩国第一区| 亚洲综合另类欧美久久久| 97舔舔| 日韩三级久久久| 日日夜夜干| 亚洲天堂性爱| 和协无码影院| 超碰这里只有精品| 美女丝袜激情小说| 四虎精品亚洲| 天天综合色图| 日语五十路和六十路亚洲国产精品| 亚洲丝袜二区在线| 日本999精品| 熟妇一区二区三区| 天堂资源站| 玖玖超碰熟| 蜜臀va69| 九九九九9999| 日韩有码 一区二区三区| 久热在线精品免费观看| 秋霞影音一区二区三区| 狠狠色婷婷7777久| 人人喜人人妻| 亚洲色情在线影视| 伊人宅男大香蕉 | 操逼操逼逼操操逼91| 强免费黄色网址| 欧美亚性天堂| 99黄页网站| 67914在线兔费成人视频| 91美女在线观看| 在线综合 亚洲 欧美中文字幕| 一本一道波多野毛片中文在线| 国产真实野战在线视频| 台欧久久精品视频| 国产精品天干天干综合网麻豆| 国产夫妻性生活视频| 日本一区二区不卡| 熟女色综合久久| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 一级久久性爱视频| 91爱综合| 亚洲在线A| 26uuu久久| www.色操逼| 欧美在线伊人色| 51一区二区三区| 国产黄色视频久久| 欧美日韩成人| 精品中文日韩字幕视频| 欧美91精品国产自产| 91成人久久| 成 人 影视 一区 二区 三区 四区| 91精品又粗又猛又爽| 大肥女高潮bbwbbwhd视频| 最新中文字幕在线亚洲| 色女综合| 9丨久久九九九| 熟女人妇一区二区三区| 久久綜合很很很| 国产一二三在线视频五十路| 欧美性爱一级操| 国产精品视频播放| 欧美激情内射| 明星性猛交ⅹxxx乱大交| 国产视频一区二区三区在线免费观看| 欧美v日韩v亚洲v最新在线| 91色图| 日韩精品一区二区三区色欲| 久久精品人妻一区二区| 久久无码一区二区二三区性色| 三级三级三级日本99| 偷拍片久久| 人妻81p| 国产九区| 国产无码精品高清| 五月天色电影| 伊人久久综合影院精品久久久 | 葡萄牙性视频一二区| 精品人人插人人操| 欧亚日本情色| 久久精品美女一区| 欧美后入式| 黑人黄片在线免费观看| 91新在线欧美| 97国产高清视频在线观看| 亚洲永久AV无码精品秋霞| 人人弄人人摸| 欧洲射精91| 你懂的在线观看区国产| 日韩影片中文字幕一区二区三区| V A在线| 五月久久HDAV| 亚洲无线观看久久| 国产人伦精品一区二区三区| 日韩欧美性爱电影在线观看| 刺激性视频黄页| 中文字幕美女91| 亚洲五区熟女| 色呦呦呦在线观看视频| 精品人妻伦一区二区三区久久| 久久精品国产亚洲AV片多多| avav青青草久久夜| 日韩人妻资源在线看| 亚洲欧美天堂| 超碰碰激情97+久| 久久无码电影| 大奶的诱惑| 中文字幕少妇色| 日本丝袜人妻内射| 东北老熟女| 男人的天堂,欧美亚洲另类国产日韩,日本高清一区二区 | 久久社区一区二区三区| 亚洲在钱| 另类图片五月| 欧美亚洲色图另类国产| 99日视频在线免费| 精品176精品2| www.国产高潮精品| 九久9精品| 九九久久国产精品| 欧美少妇高潮久久91| 91成人久久| 午夜爽爽爽| 欲香欲色天天天综合和网| 秋霞视频一区二区 | 久久黄色网址| 女人喷水视频在线观看| 人妻第一页| 九热大香蕉| 亚洲色诱惑| 欧美综合国产精品久久丁香| 成人开心网在线视频| 久久久久久久久久久97| 思思性爱| 欧美亚洲国产91在线| 亚洲极品| 超碰97网址| 日韩成人网址| 日本东京热加勒比久久| 熟女人妻精品一区二区视频 | 影音先锋少妇| 成人性交免费视屏| 啊啊啊久久久视频| 日本九九久久99播| 婷婷五月天丁香| 超碰人妻天天干| 男人天堂网址| 欧中美三级一区二区三区| 亚州日韩97| 91久久久久久久久久久| 人妻99p| 18啪啪手机免费性爱| 92一区二区| www男人天堂| 国产精品久久久久久久久久久久久久久久 | 久久精品国产亚洲AV清纯| 大但人体久久久久| 熟女高潮合集-永久久久-成人AV| 97网址www| 久久亚洲av成人无码国产| 久草国产在线视频| 日欧操屄| 日本孕妇一区二区视频操逼免费看 | 亚乱色| AV和黑人在线播放| 国产精品福利资源在线尤物| 欧美色图 色综合图| 亚洲中字慕不卡| 伊人四虎综合| 欧美天天综合站| 97伪v| 日日夜夜草草草| 9 7超碰在线免费观看| 亚洲免费精品一区| 天天看片天天爽| www.四虎在线| juliaann精品熟女一区| 精品人人| 日本美女性生活久久久久久久| 嗯嗯嗯好爽| 91精品电影18| 男人下部插入女人下部| 中文字幕精品丝袜| 日少妇亚洲版| aaa淫乱视频| 美女主播色欲91抠b在线播放| 91九色丨国产丨爆乳| 欧美永久激情一区二区| 99re69| 亚欧美综合网。| 91高潮喷水美女| 欧美日韩精品久久久久东北老熟妇| 99最新日韩偷拍视频| 99热在线只有精品| 2019天天干| 亚洲av无码国产精品字幕| 免费?级毛片无码?∨蜜芽试看| 成人av在线播放| 约操熟妇| 婷婷激情四射| 日韩 人妻 精品| 九九九九九精品十六| www.acm成人黄色毛片| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 伊人丁香五月婷婷| 艹比视频国产精品| 综合熟女| 亚洲第一二区另类图| 久久综合亚洲色1080p| 欧美日韩一区二区三区四区蜜桃| 亚洲 欧美 手机在线观看| 国产67194| 91色黑人少妇| 在线电影亚洲色图| 国产精品久久久久久久久久久久| 欧美日韩午夜精品一区二区三区| 性在久久久久久| 久久久久久人妻| 日韩午夜国产| 国内毛片四区| 欧美真人抽搐一进一出gif| 国产亚洲精品美女久久久m| 天天爽天天爽| 97在线观视频免费观看| 亚洲色婷婷综合久久一区二区三区| 啊啊啊在线观看| 久久无码电影| 丝袜狠狠草尤物人妻av91| 国偷自 一区| 日韩性爱长视频免费| 无码乱人伦中文视频| 亚洲色图久久成人| 欧洲一区二区三区四区在线观看| 成·人免费午夜在线观看| 97欧美性爱| 69综合网| 亚洲综合首页| 欧美日韩性爱操大逼| 熟女一区二区| 鸥美中出| 欧美强奸一区二区诱惑| 欧美在线啊啊啊 | 日本污ww视频网站| 欧美亚洲美少妇一区二区| 九热久| 思思热免费视频观看| 国产白嫩精品久久| 78久久| 在线国产探花| 91网站在线播放| 久久青青草原免费视频| 伊人影院在线理论播放| 蜜臀99久| 动漫爆乳3D奶水一区在线观看| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 十八岁啪啪视频免费看| 免费看污网站| 色香AV| 色九九九九久| 欧美激情精品| 涩五月婷婷| 亚洲色综网| 国产97视频免费观看| 超碰97网址| 精品三级在线专区| 久99久视频精选| 超碰九7| 国产乱码久久| 亚洲欧美高清| 欧美性爱97超碰| 久久久蜜桃臀无码视频| av大香蕉| 亚洲 在线| 中出91| 国产精品诱惑| 婷婷成人久久久精品| 一区二区影视| 天天操av懂色| 大象AV在线| 日韩影片中文字幕一区二区三区| 国产精品999aaa| 中文字幕在线观看AV| 亚洲AV无码秘 蜜桃臀国精产品| 男人的天堂在线有码| 日产操逼| 殴美日韩m| 国产精品久久久久无码A√| av东京热男人的天堂| 岛国视频免费在线观看| 2003天天干夜夜操| 色五月综合| 91网站18| 婷婷丁香一区二区三区| 色嗨嗨在线| 97人人色| 国模限制级电影| av一区二区三区不卡| 色 亚洲 91| av一区二区三区 中文| 亚洲一区二区中文字幕| 野狼激情网| 91人精品妻入口| 欧美日韩国产人人| 亚洲综合五月天| 国产精品成人AV片免费看网站| 中文字幕亚洲欧美在线不卡| 亚洲成人久久一区二区| 日夜精品| 五十路熟女工口| 欧美成人性爱视频大全| 激情小说在线视频| 亚洲有码第一页| 色区久久| 在线岛国新天堂8| 精品成人久久久人人亚洲| 天天干2019| 亚洲AV无码黄色强奸| 91伊人| 色色色色色色色色综合| 黑丝少妇在线观看| 尤物黄色在线观看网站| 秘书高跟黑色丝袜国产91在线| 97资源超碰| 国产成人精品日本视频| 午夜精品久久久| 亚欧美色图| 亚洲国产剧情少妇激情| 92人人操人人| 日本操逼aaaaa| 大茄子熟女AV导航| 一区| 欧美综合骚| www被窝色com| 78操B| 怡红院怡春院| 强奸乱伦αv片| 成年人黄色视频免费| 亚洲综合一| 亚洲、日韩、综合、另类| 国产精品老师| 26uuu性| 日本一级真人黄色性爱视频| 日本五区不卡| 日韩天天本| 性色中出| 91爽啪| 午夜丁香| 操逼网站视频漫画国产| 国产精品露脸在线观看| 日本操逼视频免费| 91天堂| 一区二区播放| 老女人91| 狠色婷婷久久一区二区三区_| 在现视频女上位好爽| 99re视频在线观看这里只有精品| 成人免费福利网站国产| 欧美日韩电影成人在线| 无码精品久久久久久亚洲| 熟妇一区二区| 日韩本不卡视频在线观看| 97就爱干| 九一国产精品| 99re在线视频| 国产和美国毛片| 四虎视频在线观看| 欧美曰韩国产精品| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 夜夜黄| 99视频自拍区| 精品女同一区二区三区| 天天性射网| 国产精品农村妇女精品| 99草精| 99热销国产这里有精品| 9Ⅰ超碰| 99热这里只有精品18| 色色九区| 日本精品五区| 国产又粗又大硬免费色网视频| 日本不卡五区| 亚洲伊人成综合成人网| 国产 日韩 欧美一区| 国产又黄又粗又猛大片| 无码137片内射在线影院| 国产强奸乱伦无码视频| 岛国片在线视频网站| 北约熟女超碰| 日韩AV无码中文一区二区| 国产一级αv免费看片| 国产成人+综合亚洲+天堂| 97精品综合| 1区2区3区在线视频| 色老汉色| 性爱AV天堂| 999热日韩精品| 欧美色图20p| 桃花色综合影院| 日韩免费大片一级播放| 蜜乳AV色欲AVAV无码| 亚洲男人的天堂亚洲| 亚洲熟妇图片| 97精品久久久久中文字幕| 老鸭窝在线视频播放| 91美女小视频| 日韩免费在线视频观看| 熟女六十路| 操狠狠| 国产肏屁眼视频| 国产精品一二三| 男人的天堂2019| 欧美一级特黄淫片在线观看| 一区二区三区欧美激情| 日本一级婬片试看三分钟| 操B在线观看| 91久久婷婷| 久久婷婷电影网| 91碰超| 天天摸,夜夜摸| 加勒比日本在线| 国语精品对白| 天天综合网亚洲综合网| 口爆吞精在线观看| 亚洲熟妇自偷自拍另欧美| 超碰天天久久79| 亚洲一区中文字幕| 精品高潮| 六月婷婷综合| 久久中文字幕人妻熟av女蜜柚| 欧美黑人性猛交91| 国产精品熟女九色九色蜜臀| 91精品人妻偷情| 亚洲性爱无码乱伦av| 美腿色图| 超碰在线日韩一区| 午夜一级免费毛片| 97超级久久强资源| 日本黄色天堂| 翔田千里爆乳巨臀无码| 国产成人网址| 亚洲天堂资源| 都市久久精品激情亚洲| 啊啊啊啊嗯嗯嗯用力好爽| 免费草草草草草视频| 18禁看网站一区| 色五月婷婷在线| 97超碰中文| 国产三级资源在线观看| 丝袜AV一二三区| 久久婷婷苹果| 黄色小视频日本txt| 黑人天8A∨高清网站| 欧美性暴力| 91久久婷婷| 加勒比av网| 国产精品黄色三级av| 欧美欲色| 天天综合97| 五月天婷婷基地| 久久久免费高清中文视频| 人干人人人操人人摸| 九热大香蕉| 亚洲影院365| 黑丝少妇麻豆| 亚洲精品九九九| 日本精品一区三区| 变态综合色| 香蕉综合网| 久久久久久久久9| 操美女高潮抽搐白浆| 亚洲图片偷拍欧美| 黄色免费网页无码| 十八禁一区二区无码观看| 国产久久成人| 97 九色| 精品九九国产无码| 超碰久久草| 黄片免费久久久久久久| 欧美亚洲成人在线一区二区三区| 精品无码不卡视频| 日韩 欧美 国产 麻豆| 欧亚乱色熟女一区二区| 经典丝袜一区| 人人干人人搞人人摸| 春色综合免费| 色婷网| 色妇综合网| 狼人综合婷婷激情四射| 囯产精品久久久久久久久久梁医生 | A片 AV一级在线播放观看免费| 劲爆欧美人妖三区91| 日本亚洲熟女视频| 巨乳特殊服务按摩| 亚洲18禁| 91久久九九精品国产综合| 日韩 欧美 校园一区| 亚洲 自拍偷拍 欧美| 美女爽爽爽刺痛洞洞| 五月丁香色色网| 国产精品熟女一区二区三区| 伊人青青一区成人视频在线观看区| 91P0RNY大屁股人妻| 欧美 牲| 国产在线视视频有精品| 精品999一区二区| 青青草视频久久久久| 一区操逼日比视频| 日韩在线观看AV| 九九毛片这里只有精品| 国产一区二区三区免费视频在性观看| 熟妇人妻一区二区三在线| 大伊香蕉在线视频免费| 久艹日日日| A男人的天堂| 欧美日韩成人在线| 91人精品妻入口| 18禁久久| 中文乱码99| 91小视频| 国产成年女黄特黄| 国产成人精品一区| 老鸭窝亚洲毛片| 日韩人妻制服丝袜av| 欧美性夜| 久9久精品视频| 99热综合| 亚洲va有码在线天堂| 啊啊啊啊好多水| 东京热熟女亚洲视频网站| 久久婷五月| 亚洲精品三区在线观看| 亚洲熟女人妻中文字幕一区二区| 91亚州欧美| 久久五月丁香| 精品中文字幕第一页| 久久无码精品| 亚洲色图伊人网| 亚洲中文制服诱惑| 国模少妇一区二区三区| 欧州一区二区三区四区| 97国产精选| 亚洲 欧美 另类 日韩 人妻一区| 99热在线播放| 手机在线人成免费视频| 百度百度日本操逼| 亚州欧美在线| 啊啊啊啊啊好舒服视频| 7月婷婷综合| 丁香六月婷婷久久综合| 尤物网址| 国产精品内射婷婷一级二| 78m成人视线| 欧美第二页午夜| 亚洲美女30b| 青草青青久久久久久国产| 久久HD| 日韩人妻中文视频| 老熟女搡BBBB搡BBBB视频| 97在线视频免费观看| 美女好片色日本| 人人爽夜夜玩视频| 久久久禁| 97自拍一区| 综合激情97 | 大香蕉手机在线| 亚洲精品97中文字幕| 天天α片| 9 7超碰在线免费观看| 91是天天| 日产国产精品中文久久婷婷| 婷婷情色综合网| 亚洲天堂美臀在线| 99热在线不卡| 日本不卡码黄色| 99超碰色| 欧美乱色| 91在线美女| 日韩丝袜人妻AV| 精品国产嫩穴视频| 美女超碰978| 男人亚洲91首页在线| 久久久久免费少妇| 五月激情天| 五月天婷婷色| 人妻少妇一区二区| 97天天爽| 五月天春色激情网| 欧美亚洲第1页| 欧美色997| 极品久久久久久久久久久久久久| 久久神马影院| 欧美视频激情久久久久久| 超碰在线97国产| 啊啊啊啊啊啊啊啊啊在线观看| 91 国产丝袜在线播放-百度| 久久久内射良家| av2014 日韩在线中文字幕| 亚欧美综合网| 欧美91精品国产自产|