当前位置: 首页 > news >正文

wordpress网站全过程举报网站平台

wordpress网站全过程,举报网站平台,wordpress创业模式,用粉色做网站主题色基本概念 SQL和Table API是Apache Flink提供的两个关系型API#xff0c;它们被设计用于统一的流和批处理。以下是关于SQL和Table API的基本概念及常用API的详细介绍#xff1a; 一、基本概念 Table API 定义#xff1a;Table API是一个为Java、Scala和Python提供的语言集…基本概念 SQL和Table API是Apache Flink提供的两个关系型API它们被设计用于统一的流和批处理。以下是关于SQL和Table API的基本概念及常用API的详细介绍 一、基本概念 Table API 定义Table API是一个为Java、Scala和Python提供的语言集成查询API。它允许用户以非常直观的方式组合来自关系操作符如选择、过滤和连接的查询。特点Table API是SQL语言的超集并专门为Apache Flink设计。与常规SQL中将查询指定为字符串不同Table API查询是以Java、Scala或Python中的语言嵌入样式来定义的具有IDE支持如自动完成和语法检测。 SQL API 定义SQL API是基于SQL标准的Apache Calcite框架实现的。用户可以使用纯SQL来开发和运行一个Flink任务。特点无论输入是连续的流处理还是有界的批处理在SQL API中同一条查询语句具有相同的语义并且会产出相同的结果。 二、常用API Table API常用操作 创建表环境TableEnvironment是Table API的入口点用于执行SQL查询、注册表、注册用户定义函数等。可以通过调用TableEnvironment.create()方法来创建一个TableEnvironment实例。从DataStream创建Table可以使用fromDataStream()方法将DataStream转换为Table。选择数据使用select()方法从Table中选择特定的字段。过滤数据使用filter()方法对Table中的数据进行过滤。连接操作可以使用join()方法将两个Table进行连接。窗口聚合可以使用窗口函数对Table中的数据进行聚合操作如统计每段时间内的数据数量等。 SQL API常用语句 SELECT语句用于从表中查询数据。例如SELECT a, COUNT(b) AS cnt FROM Orders GROUP BY a。INSERT语句用于将数据插入到表中。例如INSERT INTO target SELECT a, COUNT(b) AS cnt FROM Orders GROUP BY a。CREATE TABLE语句用于创建表。可以指定表的名称、字段、数据类型等。DROP TABLE语句用于删除表。 三、Table API与SQL API的集成与转换 Table API和SQL API集成在一个联合API中这个API的核心概念是一个表Table它作为查询的输入和输出。用户可以在Table API和SQL API之间轻松切换例如可以使用Table API进行复杂的数据转换和处理然后使用SQL API进行简单的查询和分析。同时也可以将DataStream转换为Table或者将Table转换为DataStream以实现与DataStream API的无缝集成。 注意事项 在使用Table API和SQL API时需要确保已经正确配置了Flink的依赖项和环境。Table API和SQL API的查询语句在流处理和批处理模式下具有相同的语义和结果因此用户可以在不修改查询语句的情况下在两种模式之间切换。在进行复杂查询和处理时建议充分利用Table API和SQL API提供的丰富功能和操作符来提高查询效率和准确性。 一个SQL/Table API任务的代码结构 一个基于SQL或Table API的Flink任务通常具有清晰且结构化的代码布局。以下是一个典型的Flink SQL/Table API任务的代码结构概述 1. 环境设置与依赖 首先需要确保项目中包含了Flink的依赖。这通常在构建文件如Maven的pom.xml或Gradle的build.gradle中完成。 2. 初始化Flink执行环境 // 创建执行环境BatchTableEnvironment或StreamTableEnvironment // 注意对于流处理使用StreamTableEnvironment对于批处理使用BatchTableEnvironment StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tableEnv StreamTableEnvironment.create(env);3. 注册数据源 在Flink中需要将数据源注册为表以便在SQL查询中使用。 // 假设有一个DataStreamRow类型的数据流 DataStreamRow dataStream ...; // 数据流的创建和转换逻辑 // 将DataStream转换为Table并注册 tableEnv.fromDataStream(dataStream, schema-string-or-TypeInfo); // 或者使用createTemporaryView注册为视图 tableEnv.createTemporaryView(source_table, dataStream, schema-string-or-TypeInfo);注意schema-string-or-TypeInfo定义了表的模式包括字段名称和类型。 4. 编写SQL查询 使用Table API或纯SQL编写查询逻辑。 // 使用Table API Table resultTable tableEnv.sqlQuery(SELECT a, SUM(b) AS total_b FROM source_table GROUP BY a); // 或者使用纯SQL如果已注册了表或视图 Table resultTable tableEnv.executeSql(SELECT a, SUM(b) AS total_b FROM source_table GROUP BY a);5. 执行查询并获取结果 对于批处理任务查询执行是隐式的当调用execute()方法时整个程序会运行到完成。 对于流处理任务需要将Table转换回DataStream如果需要处理结果流然后调用execute()方法来启动Flink作业。 // 将Table转换回DataStream如果需要 DataStreamRow resultStream tableEnv.toAppendStream(resultTable, Row.class); // 添加对结果流的处理例如打印到控制台或写入外部系统 resultStream.print(); // 执行Flink作业 env.execute(Flink SQL/Table API Job Name);6. 错误处理和日志记录 在实际应用中需要添加适当的错误处理和日志记录逻辑以便在作业执行过程中捕获和处理异常。 7. 清理和关闭资源 在Flink作业的末尾确保清理任何使用的资源并正确关闭执行环境。然而在Flink的常规使用中这一步通常是由Flink框架自动处理的因为当调用execute()方法时Flink会管理作业的生命周期。 注意事项 确保Flink版本与依赖库兼容。在编写SQL查询时注意SQL语法的正确性以及确保查询的表或视图已经正确注册。在流处理场景中注意处理时间、事件时间和水印的概念以及它们如何影响查询结果。在处理大数据集时注意性能优化和资源管理。 SQL上下文TableEnvironment 在Apache Flink中TableEnvironment 是处理表Table和SQL查询的核心接口。它为用户提供了一个环境用于定义表、执行SQL查询、注册用户自定义函数UDF等。TableEnvironment 有两种主要类型BatchTableEnvironment 和 StreamTableEnvironment分别用于批处理和流处理场景。 TableEnvironment 的主要功能 定义表 用户可以通过TableEnvironment定义表这些表可以是基于外部数据源的也可以是内存中的临时表。 执行SQL查询 用户可以使用SQL语句查询已定义的表查询结果可以是一个新的表或者是一个数据流DataStream。 注册用户自定义函数UDF 用户可以将自己定义的函数注册到TableEnvironment中以便在SQL查询中使用。 配置 TableEnvironment允许用户配置执行参数如并行度、执行计划优化选项等。 连接外部系统 通过连接器ConnectorTableEnvironment可以连接到外部数据存储系统如Kafka、HDFS、数据库等以便读取和写入数据。 使用 TableEnvironment 的步骤 创建 TableEnvironment 实例 对于批处理使用BatchTableEnvironment.create()方法。对于流处理使用StreamTableEnvironment.create(StreamExecutionEnvironment env)方法其中env是一个已经创建的StreamExecutionEnvironment实例。 注册表 使用createTemporaryTable或executeSql方法注册表或视图。 执行 SQL 查询 使用sqlQuery方法执行SQL查询并返回一个Table对象。使用executeSql方法执行SQL语句该方法通常用于不返回结果的DDL语句如CREATE TABLE。 将 Table 转换为 DataStream可选 对于流处理如果需要将查询结果作为数据流处理可以使用toAppendStream、toRetractStream或toChangelogStream方法将Table转换为DataStream。 执行 Flink 作业 调用StreamExecutionEnvironment的execute方法启动Flink作业。 示例代码 以下是一个简单的使用StreamTableEnvironment的示例 StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tableEnv StreamTableEnvironment.create(env); // 注册数据源表假设有一个Kafka数据源 tableEnv.executeSql( CREATE TABLE source_table ( user_id STRING, amount DOUBLE, ts TIMESTAMP(3), WATERMARK FOR ts AS ts - INTERVAL 5 SECOND ) WITH ( connector kafka, topic source-topic, properties.bootstrap.servers localhost:9092, format json )); // 执行SQL查询 Table resultTable tableEnv.sqlQuery( SELECT user_id, SUM(amount) AS total_amount FROM source_table GROUP BY user_id, TUMBLE(ts, INTERVAL 1 HOUR)); // 将Table转换为DataStream并打印结果 DataStreamRow resultStream tableEnv.toAppendStream(resultTable, Row.class); resultStream.print(); // 执行Flink作业 env.execute(Flink SQL Job);在这个示例中首先创建了一个StreamExecutionEnvironment和一个StreamTableEnvironment。然后使用SQL语句创建了一个名为source_table的Kafka数据源表。接着执行了一个SQL查询来计算每个用户在每个小时内的总金额。最后将查询结果转换为DataStream并打印出来然后启动了Flink作业。 SQL表概念 在Flink中表Table是一个核心概念尤其在处理流数据时它为用户提供了强大的查询和分析能力。 一、基本概念 定义 在Flink中表是数据的逻辑视图可以看作是对底层数据流或数据集的封装。表可以是虚拟的如视图或物理的如外部存储系统中的表。 特性 动态性Flink中的表是动态的即数据会随时间变化。这与静态表如关系型数据库中的表形成对比静态表的数据在查询期间是固定的。时间属性Flink表可以具有时间属性如处理时间、事件时间和摄入时间。这些时间属性对于基于时间的查询和操作至关重要。与流的关系Flink中的表可以与流相互转换。流可以被转换为表以便进行复杂的查询和处理同样表也可以被转换回流以便进行进一步的流处理操作。 二、创建与操作 创建表 用户可以通过SQL语句如CREATE TABLE或Table API来创建表。在创建表时需要指定表名、字段名、字段类型以及表的属性如时间属性、连接器信息等。 操作表 Flink支持对表进行标准的SQL查询操作如SELECT、INSERT、UPDATE和DELETE。用户还可以使用Table API进行更复杂的查询和操作如连接、聚合和窗口操作等。 三、类型与视图 表的类型 **内部表**在Flink内部创建的表通常用于临时存储查询结果或中间数据。**外部表**与外部存储系统如Kafka、HDFS、数据库等连接的表用于读取和写入外部数据。 视图 视图是基于表或视图创建的计算逻辑封装它本身不存储数据。视图可以用于简化复杂的查询逻辑提高查询性能并增强数据的安全性。 四、Flink表的查询与计算 连续查询 对Flink动态表进行的查询是连续查询即查询会不断根据新到达的数据进行更新。连续查询的结果也是一个动态表它会随着数据的更新而不断变化。 窗口查询 Flink支持基于窗口的查询允许用户根据时间或其他条件对数据进行分组和聚合。窗口查询是处理流数据时常用的技术可以帮助用户提取出有意义的统计信息。 计算逻辑 Flink表的计算逻辑可以非常复杂包括连接、聚合、过滤、排序和窗口操作等。用户可以通过组合这些操作来构建复杂的查询和分析任务。 五、Flink表的持久化与连接 持久化 Flink支持将表的数据持久化到外部存储系统中如Kafka、HDFS、数据库等。持久化操作可以确保数据的可靠性和持久性并方便后续的数据分析和处理。 连接 Flink表可以与外部系统进行连接以便读取和写入数据。这些连接通常通过连接器Connector实现连接器提供了与不同外部系统交互的接口和协议。 SQL临时表、永久表 在Flink SQL中临时表和永久表是两种不同类型的表结构它们在创建方式、生命周期和数据持久化方面存在显著差异。 临时表 创建方式 临时表在创建时需要使用temporary关键字可以通过CREATE TEMPORARY TABLE或CREATE TEMPORARY VIEW语句创建。 生命周期 临时表的生命周期与当前的Flink会话Session绑定。这意味着当Flink会话开始时临时表被创建当Flink会话结束时临时表被自动销毁。临时表无法在Flink会话之间共享每个会话都有其独立的临时表空间。 数据持久化 临时表的数据和表结构仅存储在内存中不会持久化到外部存储介质。因此当Flink会话结束时临时表的数据和表结构都会丢失。 永久表 创建方式 永久表在创建时不需要使用temporary关键字可以通过CREATE TABLE或CREATE VIEW语句创建。永久表的元数据通常需要外部Catalog如Hive Metastore来持久化。这意味着即使Flink会话结束永久表的元数据也会保留在外部Catalog中。 生命周期 永久表的生命周期不受Flink会话的限制。一旦永久表被创建它将持续存在直到被明确地从外部Catalog中删除。永久表可以在任何连接到该Catalog的Flink会话中被访问。 数据持久化 永久表的数据和表结构可以持久化到外部存储介质如HDFS、Kafka等具体取决于表的连接器和配置。这意味着即使Flink集群重启或会话结束永久表的数据和表结构也可以保留下来。 使用场景 临时表适用于需要在当前Flink会话中临时存储和处理数据的场景。由于临时表的数据和表结构不会持久化因此它们通常用于临时计算、数据转换或中间结果存储。永久表适用于需要长期存储和访问数据的场景。永久表通常用于存储源数据、中间结果或最终计算结果以便在不同的Flink会话或应用程序之间共享和重用。 注意事项 如果临时表和永久表使用了相同的名称在相同的Catalog、数据库和表名空间中那么在当前Flink会话中访问该名称时将始终访问到临时表。这意味着临时表会屏蔽相同名称的永久表。Flink作为一个计算框架主要专注于数据处理和计算。因此它通常不建议用户将数据存储在Flink内部即使用永久表存储大量数据而是建议将数据存储在外部介质中并使用Flink进行实时处理和分析。 SQL外部表、视图VIEW 在Flink SQL中外部表和视图VIEW是两种重要的表结构它们在数据的来源、使用方式和应用场景上具有显著的区别。 外部表TABLE 定义 外部表描述的是外部数据这些数据通常存储在文件系统如HDFS、消息队列如Kafka或其他数据源中。外部表允许Flink SQL直接查询和处理这些外部数据而无需将数据首先加载到Flink内部。 创建方式 使用CREATE TABLE语句并指定连接器和相关配置如数据格式、序列化方式等以告诉Flink如何访问和处理这些外部数据。 应用场景 外部表通常用于实时数据处理和流计算场景它们允许Flink SQL实时访问和处理来自外部数据源的数据。例如可以将Kafka作为外部数据源并创建一个外部表来实时读取和处理Kafka中的消息。 视图VIEW 定义 视图是从已经存在的表中创建的一个虚拟表它通常是一个SQL逻辑的查询结果。视图不存储实际的数据而是存储一个查询定义当查询视图时Flink SQL会执行这个查询并返回结果。 创建方式 使用CREATE VIEW语句并指定一个查询定义来创建视图。视图可以基于一个或多个基础表包括外部表和永久表创建。 应用场景 视图通常用于简化复杂的查询、提高查询的可读性和重用性。通过创建视图可以将复杂的查询逻辑封装起来使得后续的查询更加简洁和直观。例如可以创建一个视图来封装对某个外部表的聚合查询然后在其他查询中直接引用这个视图来获取结果。 临时表和永久表 需要注意的是外部表和视图都可以是临时的或永久的 - 临时表通常保存于内存中并在创建它们的Flink会话Session持续期间存在。这些表对于其他会话是不可见的因为它们的元数据没有被持久化。 - 永久表需要外部Catalog如Hive Metastore来持久化表的元数据。一旦永久表被创建它将持续存在并对任何连接到这个Catalog的Flink会话可见直到从Catalog中被明确删除。 总结 外部表允许Flink SQL直接访问和处理外部数据源中的数据适用于实时数据处理和流计算场景。视图是一个虚拟表它基于一个或多个基础表创建并存储一个查询定义。视图不存储实际的数据而是返回查询结果适用于简化复杂查询、提高查询可读性和重用性。无论是外部表还是视图都可以是临时的或永久的具体取决于它们的创建方式和配置。 一个SQL查询案例 以下是一个Flink SQL查询案例该案例展示了如何使用Flink SQL从数据源读取数据、进行查询处理并将结果输出到另一个数据源。 案例背景 假设有一个数据源source_table它包含了一些用户购买商品的信息包括用户ID、商品ID、购买数量和购买时间。想要对这些数据进行查询统计每个用户在某个时间段内的购买总金额并将结果输出到result_table中。 数据源定义 首先需要定义数据源source_table和数据输出目标result_table。这里假设source_table是一个Kafka数据源而result_table是一个文件系统上的CSV文件。 -- 定义数据源 CREATE TABLE source_table ( user_id STRING, product_id STRING, quantity INT, price DOUBLE, purchase_time TIMESTAMP(3), WATERMARK FOR purchase_time AS purchase_time - INTERVAL 5 SECOND ) WITH ( connector kafka, topic source_topic, properties.bootstrap.servers localhost:9092, format json, scan.startup.mode earliest-offset ); -- 定义输出目标 CREATE TABLE result_table ( user_id STRING, total_amount DOUBLE, window_start TIMESTAMP(3), window_end TIMESTAMP(3) ) WITH ( connector filesystem, path file:///path/to/result_table, format csv );SQL查询 接下来编写SQL查询来处理source_table中的数据并将结果插入到result_table中。这里使用了一个窗口函数来计算每个用户在每个时间窗口内的购买总金额。 -- 插入查询结果到输出目标 INSERT INTO result_table SELECT user_id, SUM(quantity * price) AS total_amount, TUMBLE_START(purchase_time, INTERVAL 1 HOUR) AS window_start, TUMBLE_END(purchase_time, INTERVAL 1 HOUR) AS window_end FROM source_table GROUP BY user_id, TUMBLE(purchase_time, INTERVAL 1 HOUR);解释 数据源定义 source_table使用Kafka连接器从名为source_topic的Kafka主题中读取数据。数据格式为JSON并且为purchase_time字段指定了一个水印Watermark用于处理乱序数据。result_table使用文件系统连接器将数据输出到本地文件系统中的CSV文件中。 SQL查询 使用SELECT语句从source_table中选择数据。计算每个用户在每个时间窗口这里使用了一个小时的时间窗口内的购买总金额。这通过SUM(quantity * price)实现。使用TUMBLE_START和TUMBLE_END函数获取时间窗口的开始和结束时间。使用GROUP BY子句按用户ID和时间窗口对数据进行分组。最后将查询结果插入到result_table中。 这个案例展示了Flink SQL在处理实时数据流时的强大功能包括从外部数据源读取数据、进行复杂的查询处理并将结果输出到另一个数据源。 TableEnvironment常用API Flink的TableEnvironment是集成Table API和SQL的核心概念提供了丰富的API用于表的创建、查询、注册等操作。以下是一些常用的TableEnvironment API及其功能说明 1. 创建TableEnvironment StreamTableEnvironment.create(env: StreamExecutionEnvironment): 基于流处理执行环境创建一个TableEnvironment。BatchTableEnvironment.create(env: ExecutionEnvironment): 基于批处理执行环境创建一个TableEnvironment。StreamTableEnvironment.create(env: StreamExecutionEnvironment, settings: EnvironmentSettings): 基于流处理执行环境和特定的环境设置创建一个TableEnvironment。TableEnvironment.create(settings: EnvironmentSettings): 基于特定的环境设置创建一个TableEnvironment适用于批处理或流处理取决于设置。 2. 注册表 registerTable(name: String, table: Table): 将一个Table对象注册到TableEnvironment中使其可以通过名称在SQL查询中引用。registerTableSource(name: String, tableSource: TableSource[_]): 注册一个外部TableSource到TableEnvironment中用于从外部系统读取数据。registerTableSink(name: String, fieldNames: Array[String], fieldTypes: Array[TypeInformation[]], tableSink: TableSink[]): 注册一个TableSink到TableEnvironment中用于将查询结果写入外部系统。createTemporaryTable(name: String, descriptor: TableDescriptor): 创建一个临时表该表在当前Flink会话期间有效。 3. 执行查询 from(tableName: String): 从注册的表中获取一个Table对象以便进行后续的查询操作。sqlQuery(query: String): 执行一个SQL查询并返回一个代表查询结果的Table对象。executeSql(sql: String): 执行一个SQL语句通常用于DDL操作如创建表、删除表等不返回查询结果。executeInsert(sinkName: String, table: Table): 将Table对象的内容插入到注册的TableSink中。 4. 配置和管理 getConfig(): 获取TableEnvironment的配置对象用于配置Table API的运行时行为。useCatalog(catalogName: String): 设置当前使用的Catalog。useDatabase(databaseName: String): 设置当前使用的数据库。listTables(): 列出当前Catalog和数据库中的所有表。listViews(): 列出当前Catalog和数据库中的所有视图。 5. 其他 connect(): 用于连接到外部系统并创建一个连接器描述器ConnectorDescriptor以便在Catalog中注册表。execute(): 在批处理模式下执行TableEnvironment中的所有操作并等待操作完成。在流处理模式下该方法通常不直接调用因为流处理作业是持续运行的。 请注意Flink的API可能会随着版本的更新而发生变化。因此在使用特定版本的Flink时建议查阅该版本的官方文档以获取最准确和最新的API信息。 SQL与DataStream API的转换 在Flink中Flink SQL与DataStream API之间的转换是非常重要的功能它允许开发者在流处理应用中灵活地使用SQL查询和DataStream编程模型。以下是关于Flink SQL与DataStream API转换的详细解释 一、Flink SQL到DataStream的转换 转换方式 Flink提供了toAppendStream和toRetractStream方法用于将Table API或Flink SQL查询的结果转换为DataStream。toAppendStream方法适用于只包含插入操作的场景即数据只会追加到结果集中不会更新或删除。toRetractStream方法则适用于任何场景包括插入、更新和删除操作。它通过在DataStream中增加一个Boolean类型的标识位来表示数据的插入或删除。 示例代码 StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tableEnv StreamTableEnvironment.create(env); // 假设已经有一个Table对象名为resultTable Table resultTable ...; // 这里是查询结果或者其他Table对象 // 将Table转换为DataStream追加模式 DataStreamRow appendStream tableEnv.toAppendStream(resultTable, Row.class); // 将Table转换为DataStream撤回模式 DataStreamTuple2Boolean, Row retractStream tableEnv.toRetractStream(resultTable, Row.class); // 对DataStream进行处理 appendStream.print(); retractStream.print();二、DataStream到Flink SQL的转换 转换方式 Flink提供了fromDataStream方法用于将DataStream转换为Table以便在Table API或Flink SQL中进行查询。在转换过程中可以指定DataStream中数据的schema包括字段名称、数据类型等。 示例代码 StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tableEnv StreamTableEnvironment.create(env); // 假设已经有一个DataStream对象名为dataStream DataStreamSensorReading dataStream ...; // 这里是数据流对象 // 将DataStream转换为Table Table table tableEnv.fromDataStream(dataStream, id, timestamp as ts, temperature); // 或者使用更复杂的schema定义 Table tableWithSchema tableEnv.fromDataStream( dataStream, id, timestamp as ts, temperature, WATERMARK FOR timestamp AS ts - INTERVAL 5 SECOND ); // 在Table上进行SQL查询 Table result tableEnv.sqlQuery(SELECT id, AVG(temperature) AS avgTemp FROM table GROUP BY id); // 将查询结果转换为DataStream如果需要 DataStreamRow resultStream tableEnv.toAppendStream(result, Row.class); // 对DataStream进行处理 resultStream.print();注意事项 在进行Flink SQL与DataStream API转换时需要注意数据类型的匹配和转换。当使用toRetractStream方法时需要处理DataStream中的撤回消息即标记为删除的数据。在将数据流转换为表时可以指定时间属性如WATERMARK以支持事件时间处理。Flink SQL和DataStream API之间的转换可能会引入一定的性能开销因此在设计流处理应用时需要权衡转换的复杂性和性能需求。
http://www.hkea.cn/news/14301218/

相关文章:

  • 合肥哪家做网站小程序开发平台需要网站吗
  • 如何做打码网站整合营销网络推广
  • 先做网站后付款网站建设与管理实训课程
  • 阿里巴巴国际贸易网站苏州专业建站
  • 电子商务网站建设的方法江阴设计公司
  • 网站 app 哪个先做深圳谷歌优化seo
  • 如何制作餐馆网站门户网站界面设计
  • 做网站视频手机做美团旅游网站多少钱
  • 什么直播可以做游戏视频网站吗品牌营销型网站
  • 如何免费制作网站如何用discuz做网站
  • 我网站正在建设中盐城经济技术开发区建设局网站
  • 锦州网站开发建设电商平台怎么搭建
  • 做网站有er图天津葛沽 网站建设公司
  • 东莞 企业 网站制作建设部继续教育网站
  • 攀枝花做网站网站流量指标
  • 网站运营优化方案网站建设的销售话术
  • 查询域名是否做过网站网站制作方案书
  • 网站挂黑链工具创建域名
  • 北京做网站开发公司电话闵行广州网站建设公司
  • 可以做任务的网站有哪些内容免费开店的外贸平台
  • 网站2个页面做首页网络营销模式下品牌推广途径
  • 广州品牌建站广州品牌建站网络促销分类 网站促销
  • 洛阳哪里做网站邢台哪里可以做网站
  • 网站布局结构数码产品在哪里做网站
  • 做网站的抬头标语怎么做个人网页完整代码
  • 贵州城市和城乡建设官方网站数据库如何导入wordpress
  • 前端开源项目网站wordpress 注册用户列表
  • 世界服装鞋帽网免费做网站广州网站开发设计
  • 品质培训的网站建设wordpress目录标题
  • 网站建设昆明网站建设课件