国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲AV片高清资源在线观看_国模无码一区二区三区久久_国产成年人未进视频_中文字幕无码精品夜_一区二区三区在线视频免费看_亚洲成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
返回資訊列表
亚洲日韩美国人妻| 精品丰满熟妇人妻一区| 美女写真| 大香蕉久久| 久久一二三四不卡 | 国产成人拍国产亚洲精品| 中文乱码99| 免费人成?大片在线播放| 91 国产丝袜在线放观看| 亚洲揄拍网| 91欧美性| 国产JDAV无码视频在线观看| 欧美少妇大量自拍视频在线观看| 中国熟妇| 综合自拍| 欧美中出| 99久久com免费视频′| 欧美综合综合| 成人影 天天操 亚洲| 亚洲天堂资源网| 四色永久成人网站| 78久久| 性爱视频久久| 国产亚州精品美女久久久免费| 日本不卡五区| 国产精品香蕉| 欧美精品亚洲精品日韩传电影| 久久夜色一区二区| 精品国产一区二区三区久久久蜜臀 | 美女干逼2| 六六久久日韩不卡| 色99视频| 99国产人成精品| 日韩A优精品在线观看| 男人天堂最新手机版在线青青草| 日韩免费看在线黄色片| 亚洲日韩电影| 中文字幕人妻色偷偷久久皮| 日本有码影片下载| 久久精品人体| 综合色图区| 久久久久久久久久久久欧美日| 爱射综合| 99亚洲人人| 91色综| 一二三四免费视频| 亚洲欧美成人在线| 狠狠色综合网| 久久国色天香香蕉| 国产精品一区二区麻豆| 中文字幕黄色一起草| 亚洲男人天堂视频| 怡红院久久老司机| 综合第一页| 久久久四区| 性九九九九九九| 久久精品综合| 91在线丝袜视频| 青久操| 亚瑟国产精品久久无码| 91人妻在线视频| 天天日夜干| 91性网| 日韩一级久久毛片| 色欲三区| 亚洲经典啪啪| 97色色色综合网站| 视频在线中文字幕| 日韩精品午夜操呦呦不卡影院| 91丝袜在线播放| av影片在线观看不卡| 欧美中文综合| 影音先锋日本乱伦| 久久精品色欧美aⅴ一区二区| 黄页视频网站野外| 欧美色偷拍 | 国产伦乱91| 欧美日韩激情无码专区| 乱伦系列一区二区| 大香交伊人网| 91丨熟女丨丰满熟女| 岛国黄片网站| 亚洲中文字幕精品久久久久久直播| 嫖老熟女A片一二三区| 婷婷久久五月天| 亚洲午夜免费狠狠干| 亚洲精品 大香蕉| 一区二区三区日韩欧美| AV在线播放网址| 深爱伊人影院| 国产在线能看的你懂的| 熟女乱伦二区| 亚洲精品国语在线播放| 在线中文字幕极品av| 精品久热| 大香网伊人久久综合网eew| 国产夫妻性生活视频| 日韩三级伦理中文字幕| 欧美一区二区一级岛国大片| 久热99999| 婷婷人妻激情| 日韩操啪| 亚洲天堂,男人| 操淫穴亚洲五月丁香| 91第一页| 伊人激情| 97精品视频在线| 亚洲熟女乱色一区二区三区| 激激五月| 国产人妖的免费的视频| 九九热男人天堂| 裸体1区| 99re热| 亚洲婷婷综合网| 97在线精品| 白 大 人妻 区 在线| 久久精品操| 天天爽夜夜爽夜夜爽精| 免费人成?大片在线播放| 美美91成人国产精品欧美精品久久久久久久| 性生活性生大爱77AV国产| 啊啊啊免费视频| AV丝袜少妇| 欧美美女在线高潮999| 五毛骚逼极品美女怕怕| 鸥美极品| 亚洲伊人久久综合97| 五月婷婷激情| 欧美精品97| 五月激情小说| 99999精品| 欧美成人都市人妻| 91亚洲图片| 99激情视频| 99精品九九九九九九| 日日夜夜精品| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 国产精品探花色| 97一区二区蜜臀| 亚洲AV麻豆Aⅴ无码电影一| 色嘟嘟人妻天堂网| 九月激情婷婷| 久久露脸国产老熟女| 熟妇人妻一区二区三区| 超碰九九| 色妹子A V| 男人的天堂久久狠| 久久丁香五月天| 天天干18禁| 久久久精品国产亚洲伊人| 亚洲精品人体| 亚洲熟妇熟在线电影视频| 熟女乱3伦999| 亚洲成人帖图| 中文字幕二区日韩天堂| 91国产精品熟女| 四虎 精品 WWW| 久久久艹艹艹| 黄页网站成人免费| 亚洲精品国产无码高清| 91精品国产高清久久久久久,亚洲成人 | 羞答答AV中文字| 欧美激情另类一区二区| 嗯嗯啊啊啊啊轻点视频| 激情小说五月天| 伊人九九九| 日本天天人人狠狠在线日美女 | 人人操人人93| 日本二区不卡| 熟女自慰久久久| 无码人妻丰满热妇又大又粗| 天天综合97| 超碰夫妻97| 综合色啪| 国产特级毛片AAAAAA高潮流水 | 久久9久9久99久9久9| 午夜福利国产欧美日韩夜夜| 青青操日韩| 亚洲丝袜天堂| 大香蕉伊人色偷偷在线| 热久久国产| 亚洲欧美另类小说| 亚洲超碰综合网| 亚洲天堂人妻一区二区| 大香网站| 国产亚洲精品无码三区| 精品1区2区3区| 91+欧美| 国产精品岛国片在线观看| 色九九九综合| 亚州日韩97| 大胆91| 激情综合网五月婷婷五月天| 乱伦一区二区三区‘| 大香蕉中文网| 欧美综合自拍亚洲综合图| 偷拍网站久久男女男| 国产三区免费在线观看| 18禁的网站在线| 7777奇米影视久久| 性在久久久久久| 欧美精品宗合| 超碰成人人人爽人人爽| 久久国产在线一区二区| av影片在线观看不卡| 中文字幕1区2区| 国产热av| 天天综合91| 国产又色又爽又舒服的三级视频| 男女一进一出视频久久| 超碰97亚洲| 午夜噜噜噜| 精品少妇高潮久久| 亚州五月| 伊人一区二区三区| 99热婷婷| 国产精品乱人伊人网| 婷婷色色五月天福利| 超碰78| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 蜜臀久久99精品久久综合| 色综合九九| 性在久久久久久| 国产乱色国产精品免费视| 视频一区二区免费在线| 亚洲**2021在线观看| 深夜福利黄片| ji熟女.com| 女人被男人桶爽视频网站| 中文字幕天堂在线| 超碰无码加勒比| 国产精品人人爽人人做可爱福利| 亚洲图片日本AⅤ欧美在线| 亚洲图片 激情小说| 日韩不卡码| 曰韩少妇无码| 久久xxxx| 久草色悠悠在线视频| 玖玖97综合 | 久草在线| 中国农村熟妇毛片视频| 日韩乱伦影音先锋| 中文字幕在线观看丝袜| 欧美日韩色图片| 91殴美大片| 久久夜夜夜夜| 欧美熟女逼久久久久久| 超碰吊日色| 九九操久久国产免费视频| 91精品国产91熟女| 日日爱99| 午夜福利在线合集| 丝袜六区| 久久偷偷色综合蜜桃| 亚洲色图国产另类| 欧美—性—交—色| 欧美精品一区二区少妇免费A片| A 在线网址| 亚洲 日韩 丝袜 熟女 变态| 婷婷亚洲中文字幕在线| 天天综合站| 日韩97P| 免费av在线播放二区| 搡老女人老熟女91| 色噜噜精品一区二区三| 夜夜爽77777| 97视频620| 91无遮挡| 天天看,天天做| 91在线综合网| 成人精品久久| 无码78| 中国国国产一级特黄毛片| 欧美亚涩| 国产99999久久精品| 亚洲在线91| 日韩,欧美,中文在线| 五月天色图| 国产精品久久久久久久久久久久久久久 | 91撸色网 玖玖网 欧美| 美女91| 日韩A优精品在线观看| 国产又粗又又黄又猛| 狠狠干妹子| 亚洲图片色图欧美另类| 无码日韩人妻av一| 在线 亚洲 网爆 自拍| 限制级中的三级片中的黑粗大屌屌日人妻熟女| 思思热在线视频免费| 国产激情av女片自拍| 懂色AV一区二区三区| 久草成人影片| 强歼乱伦资源网| 操b网站亚洲无码| 大香蕉欧美| 激情AV| 久草毛片| 午夜理论片在线观看免费| 67194无码不卡| 97天天| 日本污ww视频网站| 精品少妇高潮久久| 欧美一级A片在线看视频性色| 成人五月天色网| 74成人在线| 久久伊人青青草| 大香蕉中文在线| 亚洲精品影视老司机| 精品9区| 歐美一級亂黃99在綫精品| 好湿好紧视频| AV天天在线观看| 素颜老阿姨乱情色| 欧亚性爱视频免费看| 一区二三区四区视频大全套| 国语对白在线播放视频| 玖玖资源视频一区二区三区| 青娱乐日韩无码| 欧美综合色图片| 色9999日韩国产| 无马一区二区| 亚洲色图 欧美热图 清纯唯美 另类自拍| 97资源站日韩| 无码自拍SM| 日本二三四区| 久久超碰爱| 九九九精品色乱九九九| 欧洲熟妇xxXx欧美老妇裸体| 久久系列| 欧美激情久久久久| 午夜色婷婷| 欧美色图亚洲激情| 欧美日韩亚洲电影| 色5月婷婷| 91网站18| 天综合网欧美| 欧美性天天影视| 国产精品探花色| 日韩人妻精品| 亚欧精品久久久久久久久久久| 青青操在线视频| 1024亚洲中文字幕久在线看片你懂的| 欧美日韩中文字幕人妻| 东京热精品97综合网| 岛园激情| 成人小说另类在线| 人妻少妇精品无码专区二区密桃| 国产吞精a级片激情电影| 97日韩超碰超碰中文字幕| 偷拍欧美激情| 99热综合| 91社操逼| 人妻一二三区| 丰满人妻一区二区三区四区| 日韩伦理久 久久 清纯| 中文字幕人乱码中文字的预防方法 | 欧美国产视频| 九九亚洲视频| 国产AV无码AV| 国产无码久久高清| 综合网少妇| 99精品伊人| 97色色视频| 十八禁的黄污污免费网站| 97神马久久| 99黄页网站| 国产在线不卡导航| 色色色99| www.91人妻.com| 亚洲91色| 干美女人妻| 久久综合女优| 中文字幕日产av人| 天天爽天天干| 丁香啪啪| 麻豆啪啪啪视频| 18禁无码永久免费无限制| 91亚洲网站| 夜夜国自区| 亚洲十八禁止| 秋霞鲁丝午夜无码一区二区三| 久久色激情一区二区三区| 亚洲综合九九| 国产日本久久免费精品| 在线无码网站| 淫荡少妇免费| 亚洲资源站| 亚洲欧洲综合| 后入福利视频| 久久久久极品| 97色操| 午夜一区| 蜜臀久久99精品久久久久久酒店| 久久久亚洲精品中文字幕人妻| 天天拍天| 97精品97久久| 90后后入| 欧洲综合色图| 97啪啪| 920日本午夜免费| 免费看久久久性性| 成片免费观看视频大全| 99热精品在线| 玖玖97综合| 操狠狠| 青青草中文-久久青草精品一区二区三| 婷婷视频在线免费观看| 这里只有精品视频在线| 欧洲无码一区二区| 色一射色一射| 国桃视频产巨乳精品一区二区在线| 亚洲视频小说| 一级免费精品| 久久久久久久97| 大学生美女口爆| 国产精品白领在线观看| gogogo免费高清看中国国语 | 凹凸视频在线观看伊人| 国产三级电影免费观看| 屌色在线97视频| 日韩AV电影网站| 草久久久| 久久九九热| 国产极品馒头逼| 免费看片黄| 日韩国产在线观看av| 欧美日韩国产黄色片| 黄在线| 男人天堂一区二区| 久操 高清| 无码人妻系列少妇| 久久久久久久性爱| 亚洲欧洲无码bt精品合集| 久久91视频| 久久久久人妻| 亚洲少妇激情视频| 91宗合网| 少妇久久久久久| 在线人成亚洲视频免费观看| 亚洲欧洲无码一区夜| 日本免费二区三区| 俄罗斯及免费在线看| 久久久久久久亚洲Av无码| 亚洲成?V人片在线观看福利| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 久久精品一区一起草| 亚洲欧美综合| 99ri精品| 东北操逼| 中文字幕一区二区视频在线观看| 亚洲操逼无码| 麻豆视频test| 91n处女在线观看| 国产午夜在线观看视频| juliaann精品熟女一区| 抽插亚洲无码| 久久鲁干| 97碰碰日本乱偷人妻中文的| 99热这里只有精品18| 艹比视频国产精品| 大香蕉在线视频重口味毛片在线| 欧美AB在线| **一级毛片国产| 日韩三级一区| 久久久久久久| 精品国产片亚洲一区| 青青青国产| 97久久国产| 欧美日韩性爱精品| 91欧洲入口| 奇米狠999| 最新av在线| 日本伦乱九九九综合| 午夜国产成人福利视频| 走光一区92下载| 欧美爱三级日韩久久| 伊人成人中文字幕久久网| 狠狠97| 国产激情av女片自拍| 欧美亚州色的图| 国产精品网址| 人妻熟女av国产网站| 91欧美巨乳| 一区二区三区黄片免费观看| 色欲色香天天天综合网www-亚洲综合国| 97啪啪| 另类小说五月天| 韩日巨乳美女免费视频在线观看| 欧美色视频在线| 久久草草亚洲蜜桃臀| 美女黄页| 亚洲福利影院一区久久| 大吊色| 18禁免费视频| 亚洲丝袜天堂| 亚洲欧美国产va在线播放频| 后入人妻一区| 日韩强奸av| 免费人人搞97| 亚洲国产麻豆一区二区三区| 九九九九欧美| 人成午夜免费大片| 久草新在线| 婷婷五月天在线观看| 天天亚洲| 日韩av三四区| 人妻色偷色噜| 欧美人妻另类在线| 男人夜色天堂ss| 欧美中出| 亚欧美综合网。| 久99视频| 中文字幕丰满子伦无码专区在线视频最新| 男人天堂站| 温婉少妇玩3p| 欧美性夜| AV中文字幕剧情1区2区3| 国产激情av女片自拍| 国产精品乱码久久久| 97五月天| 韩国手机不卡无码三级视频| 精品一区二区2| 日本亚洲vr欧美不卡高清专区| 风韵犹存大大大大香蕉| 天堂国产AV| 午夜福利精品| 又大又大又大又粗爽高潮观看| 美女毛片999| 九九RE视频在线精品| 国产一级内射高清视频| 中文字幕视频2区| AV网站高清无码在线观看| 国产97色在线| 经典丝袜一区| 久久国产99精品72福利| 强奸熟女一区二区三区 | 亚洲高清少妇| 久久最新免费视频23| 青青久久手机线视频| 成年人黄色| 久区视频| 蜜桃臀AV在线| 五月天色图| 99性爱视频| 国产女人操逼视频| 国产亚洲精品无码三区| 天堂综合网| 欧美韩国你懂得在线 | 久久精品中文字幕无码l| 后入合集| 91精品国久久久久久无码| 亚洲精品819| 色五月丁香五月| 熟女精品va中文字幕| 国产精品麻豆成人av| 久久色精品视频在线| 天天看高清麻豆| 性感女人网页在线观看视频| 色五月婷婷五月天| 午夜男女爽爽爽在线视频| 秋霞午夜成人福利片片| 97日韩超碰超碰中文字幕| 欧美精品,四区。五区| 日韩少妇在线视频| 草b在线| 国产免费大片| 五月丁香久久| 五月天黄色激情视频| 嫩草一区二区在线观看| 欧美日韩在线国产在线| 精品一区二区成人| 亚洲色图欧美色图日韩色图| 国产AV激情无码久久无码| 色欲三区| 精品久久久高清无码| 2020中文在线一区二区三区| 成人A片男人的天堂| 色女99一级片在线观看| 国产丰满熟夫69mpp| 2019天天操天天爽天天拍| 久久超碰亚洲人| 91jk色拍| 亚洲熟女乱综合一区二区三区| 东京热精品97综合网| 强奸熟女一区二区三区| 青青草玖玖爱| 加勒比av中文| 欧美性五月| Aa东京男人的天堂| 色与欲影视天天看综合网| 欧美美逼| 一级性爱视频免费观看| 久久久久久一日韩字幕无码| 萌白酱自拍视频| 欧亚在线视频| 国产精品老熟女一区二区| 夜夜爽妓女| 在线 亚洲 网爆 自拍| 伊人操操| 夜夜嗨一区二区三区三州加勒比| 久99在线免费观看视频| 国产精品伦理| 屁股久久久久久久久久| 国产乱色国产精品免费视| 亚洲成a人片在线观看中文!!!| 亚洲精品久久久久久久蜜桃臀| 日韩高潮一区| 安徽熟妇视频| 精品然女一区二区| 久久午夜神马| 日本1区2区不卡视频| 黑人无码一区二区| 天天操天天射青青草| 吉川爱美亚洲二区在线| 老熟妇一区二区三区啪啪| 欧美日动态视频| 97久久综合网| 都市久久精品激情亚洲| 操www| 天天干天天操天天干天天操| 高凊专区人人操| 久久久久久久久久久久久久久久9| 久啪| 老熟女天天操| 国产欧美日韩臀| 日韩久射综合| 国产区91柔拿会所技师| 欧美狠狠弄| 亚洲天堂日本| AV乱伦国产| 人人操AV| 亚洲高清在线se| 91丝袜在线观看| 熟女乱伦二区| 亚洲综合色在线| 尹人免费观看视频在线| 久久久A∨| 伊人视频| 一区操逼日比视频| 丝袜夫妻自拍| 国产精品久久久久9999小说| 亚洲国产精品成人无码久久久| 日韩国产品视频中文字| 97操碰| 日韩精品在线观看网站| 91久久堂| 日本性爱欧美性爱| 精彩国产视频播放1区2区| 久久久久九九九| 99久久e免费热视| laoshunv91| 级做a爱无码性色永久免费| 免费看毛片操穴| 老女人老91妇女老热女| 男人天堂网站| 岛国精品视频在线观看| 欧美青青草视频| 中文字幕中文字幕一区二区| 伊人久久国产免费观看视频| 日本一区二区中文字幕久久| 蜜臀少妇一区二区| 少妇人妻在线| 日韩av乱伦| 国产乱码久久久| 在线国产探花| 中文字幕乱妇免费视频| 五月激情在线| 骚女天天综合网| 色综合美国| 神马九九| 亚洲综合图文| 精品国产一区二区三区香蕉欧美| 色色色色色色色色综合| 亚洲欧洲日韩国产自在线| 青青草日韩免费观看高清在线| 久久五月天婷婷丁香中文字幕| 黑人精品一区二区在线播放| 色五月天AV| www.99中文字幕| 亚洲成人帖图| 亚洲男人bt天堂| 欧美一级A一级a爱片久久| 在线啊啊啊啊| 国产一区二区a毛片| 啊啊啊啊啊啊啊在线| 欧美一区二区亚洲天堂| 熟女91网站| 国产无遮挡| 狠狠操官网| 亚洲人人夜夜澡人人爽| 久久,精品一二三| 99无码狠狠久久| 天天澡天天爽日日av| 久久AV无码网址| 97se亚洲综合自| 欧美激情片一区二区| 国产成人精品日本视频| 丁香婷婷啪啪| 免费成人在线观看91| 欧亚性爱啪啪| 超碰午夜在线| 欧美色青| 天天欧美色| 日本高清一本二本免费不卡| 国产熟女无套内射| 日亚韩精品视频二区三| 午夜成人福利影视| 强奸抽插av| 婷婷四五区| 久久精品无码专区| 青草av在线| 人妻另类| 开心五月深爱五月| 97视频免费| 美国一区二区三区视频| 精品无码人妻一区二区免费蜜桃| 五月亭亭六月丁香| 婷婷五月天久久精品视频一区二区三区 | 性综合网| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 91国产美女丝袜足交精品视频| 成 人 A V免费视频在线观看| 国产刺激视频| 中文字幕97| 日本九九久久99播| CCYY草草影院地址入口| 亚洲熟女国产综合另类| 日韩成人小视频| 色色色综合| 欧洲人妻视频| 青青草密桃在线播放| 99热婷婷一区二区三| 欧美麻豆成人同性GⅤ在线| av日韩中文字幕| www色色com| 精品人妻一区二区三区四区不卡在| 97精品国产97久久久久久| 乱操乱伦AV| 四虎在线视频| 欧美精品二区视频在线| 正宗无毛一线天嫩逼| 青青草日韩无码| 日韩A优精品在线观看| 91久久| 国产精品毛片| 91人妻视频| www.yw尤物| 亚洲福利影院一区久久| 密臀国产在线| 中文字幕日韩精品一区二区三区| 欧美一区二区三区日韩| 在线播放免费av福利片| 1000午夜黄色| 1区2区3区中文字幕日韩| 小情侣高清国产在线视频| 久久精品一区二区三区四区五区| 91天美传媒精品| 天天欧美色| 日本精品高清一二区一本到| 久久久久久亚洲Av无码| 97伊人网| 2017天天插| 夜夜操一区二区| 超碰97玖玖爱| 91女神在线视频| 久久久久中出| 四虎永久在线精品免费网址| 清纯唯美激情四射| 欧美 亚洲 另类 综合| 中文字幕片| 欧美性爱一区| 国模91| 亚洲熟女av中文字幕| 久久国产乱子伦精品免费女,网站| 天天久久久久久| 综合网亚洲在线| 精品国产乱码久久久久久网站入口| 91国产丝袜白虎| 亚洲高清91| 99婷婷一区二区| 懂色天天爱天天日天天射天天澡| 国产精品一区二区 尿失禁| 久久一区二区三区入口| 99在线免费观看| 嗯~啊~快点 死我视频| 伊人伊人LD| 不卡在线观看视频| 久久黄色性爱视频| 乱人伦 国语对白:视频直接看| 一区二区 电影 亚洲| 午夜操一视频一区| a片自拍直播视频| 日韩丝袜二区| 蜜桃色院一区久久| 亚洲 欧美 色图| 久久精品久久久久久久久| 精品中文字幕一区二区l - 百度| 99色视频| 91欧| 可以在线观看的黄色网址| 亚洲综合另类| 婷婷国产精品一区二区| 久久av成人无码免费| 国产婷婷一区| 日韩免费a级毛片无码a∨| 啪啪资源网| 天天欧美色| 一区二区播放| 人妻aa| 夜夜免费视频| 探花在线免费观看视频国产一区| 日韩精彩免费| 丰满人妻区一区二区三| 人妻精品视频一区二区| 色九九久九九| www.激情| 色悠久| 亚洲色图加勒比| 久久AV无码AV| 高树玛利亚无码流出| 成人小电影网站tex| 色婷五月| 国产97亚洲| 很很干很很操| 久久这里只精品免费福利| 九九热精彩视频| 97人人夜夜精品视频| 嗯嗯,好大,好爽,好骚| 国产精品久久久久久久久久梁医生| 国产久久久9999| 欧美人体性爱互联网第一页婷婷日本| 97视频网站在线观看| 日本人妻伦在线中文字幕| 欧美老妇女内射网址| 亚洲精品乱码线路中文字幕| 久久久久国产| 五月色综合| 日日噜噜夜夜狠狠视频无| 神马影院午夜福利久久久| 国产成人无码啪| 2020中文字幕在线| 四虎永久在线精品免费网址| 懂色天天爱天天日天天射天天澡| 久久久久久少妇| 曰韩精品九九无码| 啪啪资源网| 欧美色青| 国产999精品久久久| 中文字幕久久精品一区| 一级性爱aaaa| 后入 亚洲 美女 射| 最近的最新的中文字幕视频| 亚洲成熟国产精品美女| 翘臀vidoes| 超碰午夜| 在线播放成人高清免费视频| japan日本高清乱xxxx| 亚洲成人av色网| 激情五月天校园春色网| 亚洲丝袜少妇在线| 加勒比色99999| A V少妇特黄三级| 99热思思| 日本精品无码三级网站| 欧美不卡在线一区二区| 青草成人免费视频一COm| 亚洲素人综合| 人人操人人操人妻人| 一本大道久| 一二三四区电影| 极品色综合| 日本久久999| 人妻熟妇久草在线| 懂色av中文字幕一区二区三区天美 | 天天澡天天爽日日AV| 97日韩欧美亚洲| 久久精品毛片免费不卡| 欧亚 另类 久| 亚射在线| 狠狠色婷婷777| 91狠狠综| 久久9999| 在线女人91| 国产成人免费观看在线视频| 亚洲视频精选| 大香网伊人久久综合网eew| 熟女突然公开看18禁影片| 成年无码动漫av片无尽在线| 天天日美女的B| 久久精品人体| 狠狠色噜噜狠狠狠狠狠色综合久久| 色区97| 亚洲大色堂| 五月丁香六月激情| 国产亚洲中文不卡二区| 中文字幕乱码在线| 2003天天干夜夜操| 色五月天AV| 麻豆精品久久久久久久| 国产三级中文有码在线视频| 亚洲国产成人综合碰碰三级经典| 女上位精品在线| 日韩99神马视频播放| 色五月综合| 亚洲精品aa久久伊人| 亚洲电影中字一区二区| 欧美色综合网| 欧洲站一级二级三级h| 中文字幕人妻色偷偷久久皮| 老鸭窝亚洲毛片| 六十路日本| 乱伦AVxx| 搡老女人老妇女AAA一VU麻豆| av影片在线观看不卡| 人人妻人人爽人人精品| 色爽——AV| 色九九九综合| 久久最新视频免费观看| 欧美三级一级| baisiav| a人欧美综合天堂麻豆| 无遮挡h肉动漫在线观看| 吖在线不卡一区二区国产剧情| 天天影视亚洲| 欧美激情内射| 色老大| 亚洲AV永久无码精品成人调教| 精品国产久久乱码| 亚洲成人色情五月天丁香花| 人妻一区久久二区三区色播| 东北女人av| 欧美大香蕉卡久久| 久操99| 蜜臀av中字字幕网站| 偷拍 亚洲| 亚洲欧洲美腿丝袜| 大香蕉手机在线视频| 无码99| 国产suv精品一区二区四| 激情四射婷婷四五月天| 欧美性猛交美女自慰91| 香蕉在线一区二区三区| 东京热激情视频一二三区| 九九久久九九久久| 久久国色天香香蕉| 国产精品 午夜福利| 九九热超碰97亚洲最新香蕉| 乱老熟女一区二区三区| 9999九九九久久久| 在线电影亚洲色图| 国产激情在线| 午夜美女福利视频| 操逼视频国产无套| 国产自产自拍| 3p国产欧美99热| AA丁香综合激情| 色月天AV导航| 亚洲资源网| 久久中文字幕人妻熟av女蜜柚| 中文字幕1区2区| 九九九热| 岛国大片在线观看网站入口| www黄片免费看com| 99精品久久| 精品久一区免费| 国产情色第一第二页在线观看| 久久风骚城市| 97超碰站| 人人操人人摸人人看人人干| 中文字幕一区日韩精| 天美国产三级传媒| 九九九九九用不成了| 日韩无码服务区| 欧美性xxxxx狂欢| 国产精品呦一区二区三区| 成年女人18级毛片毛片免费观看| 亚洲有薄码区日本系列中文字幕| 99久久综合| 有码专区最新中文字幕有码| 青青操网| 欧美色综合影院| 夜夜高潮夜夜爽| 伊人久大| 丁香五月电影| 少妇诱惑视频| 亚洲做性| 99久久精品无码一区二区毛片免费| 最新国产亚洲精品精品国产亚洲综合| 95人妻爽爽人人做人人澡| 夜夜嗷嗷一区二区| 欧美色网络| 精品亚洲黄色片 国产精品导航一区二区| 欧美一级色| 加勒比av中文| 97亚洲综合影院| 欧美顶级黄片AAAAA在线免费看 | 六月婷婷综合| 好好的日:com久久九九| 亚洲男人天堂网站| av日韩国产一区二区| 97爱爱爱综合| 2020天天色综合| 啪啪视频亚洲第一| ′ !γ}丶。。久久精品欧美一区二区三区| 蜜桃精品视频一区| aa片毛片| 五月天社区| 久久r精品| 亚州免费啪啪视频| 中文有码第五页| 日本色日夜干| 久久久久婷婷| 中文字幕欧美日本乱码一线二线 | 美女啊啊啊啊啊啊啊| 日韩在线观看AV| 亚洲AV无码黄色强奸| 熟妇艹鸡八| 欧美色欧美| 日本在线一二| 亚洲高潮影院| 女人双腿搬开让男人桶| 国产精品第二页| 自拍偷拍国产欧美日韩韩| 大香蕉色十月| 熟妇女伦乱视频| 热九九精品| 超碰偷拍| 亚洲第一无码播放立川理惠| 1204金沙人妻懂旧版免费| 岛国黄片网站| 2025亚洲男人天堂| 蜜臀一区二区三区在线| 亚洲色图大香| 1240青青草一区二区三区视频天爱| 久久人人爽人人爽人人片Ⅴ| 成人精品水蜜桃久久久久久久| 成人a大片在线观看| 久操在97| 人人操人人操人人操人人操人人操人人人11.CM| 日本免费不卡二区| 91视频精品| 超碰97网址| 成 人片 黄色大片| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 中文字幕一区二区三区蜜臀| 亚洲国产综合视频| 日韩中文字幕熟妇人妻 | 青青草在线视频欧美| 26uuu国产亚洲综合| 人妻无码久久一区二区三区免费| 亚洲图片婷婷五月天| 日本中文字幕熟妇| 麻豆这里只有精品| 日韩有码专区| 大香蕉十区| 亚洲成人日韩小说| 欧美精品亚洲精品日韩传电影| 日本3级一区二区免费| 青青青青操国内视频在线| 亚洲天堂女优在线| 高潮的A片激情扒开一区| 日日骚精品视频| 人妻人人操| 久久久97| 天美传媒AV国产在线| 围产精品一区二区三区视频播放| 欧美亚洲色的图| 日韩人妻大香蕉| 五月天久久综合网| 偷拍亚洲情色| 人妻少妇蜜桃视频欧美一区| 黄色大片免费在线| 大干人妻| 北京专精特新企业招聘信息| 日韩黄片视频试看| 亚洲精品久久久久久| 夜夜嗨AV一区天天| 18禁中文字幕| 少妇淫妇久久久久久久| 麻豆婷婷成人一二三| 超碰成人最新最好看| 清纯唯美亚洲综合| 无码丰满熟妇一区二区浪潮AV| 一二三四区操操Av| 99久久无色码| 国产树林里野战在线看| 97超碰超碰| 超碰97欧美日韩| 国内91熟女人妻丝袜天天精品视频在线| 岛国1区2区3区在线观看| 涩亚洲欧洲| 色婷婷综合久久久久中文一区二区 | 亚洲色综合| 亚洲激情综合另类男同| 999热这里只有精品| 欧美夜色| 天综合网| 中文字幕亚洲在线一区| 亚洲性爱成人| 丰满人妻-区二区三区免费看 | 天天激情干| 丝袜亚洲综合| 亚欧操逼片在线观看 | 99草精| 日韩精品99久久久久久中文字幕| 色丁香久久| 亚洲精品官网在线观看| 啪啪视频免费在线观看| 中文字幕第7页| 九九九九九精品十六| 国产视频一区二区在线观看| 国产在线精品偷| 国产黄片精品在线| 亚洲AV无码秘 蜜桃臀国精产品| 97操碰| 日韩专区久久久| 蘋果手機免費看成人Av| 色鬼在线综合| 欧洲无码一区二区| 九九热超碰| 网页导航五月天免费一二三区| 欧美精品69性爱| 伊人操| 亚洲精品欧洲色| 欧美,日韩,中文,另类| 成人精品视频| 绑缚麻绳人妻寝取完整版| 亚洲熟女乱色| 久久超碰爱| 67914亚洲精品| 日本一级一级一级一级| 亚洲精品三| 5278欧美一区二区三区| 日韩不卡在线一区二区| 乱伦一区二区三区‘| 亚洲国产成人7777| 国产91亚洲精品一区二区三区| 天天综合网91| 天天色欧美| 日韩无码一区二区三区| 亚洲熟女综合一区二区| 国产精品久久泡妞网站| 精产品久久| 天天综合官网| 欧美激情综合网| 97超碰精品| 免费操逼91| 乱性AV| 亚洲欧洲综合成人av一区| 亚洲无线码欧洲精品区别| 激情五月天插| 日韩成人性爱AV| 综合久久欧美| 国产白丝网站| 欧美—性—交—色| 精品人妻一区二区三区免费视频| 国产一区二区a毛片| 中国少妇XXXX做受| 日韩一级成人毛片免费观看 | 亚洲五区熟女|