Flink最锋利的武器Flink SQL(入门篇)

flink中动态表的时间特性 flink中动态表的时间特性 一、processTime 1)DataStream转化成Table时指定 //1.获取执行环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); env.setStreamTimeCharacteristic(TimeCharacteristic 阅读详情

 

本文目录简介

  • 介绍

  • 计划器

  • Flink与Blink流批环境

  • 表

  • 支持连接资源

  • 创建数据源表

  • 创建数据结果表

  • 创建数据维表

  • 小案例

介绍

Flink SQL 是 Flink 实时计算为简化计算模型,降低用户使用实时计算门槛而设计的一套符合标准 SQL 语义的开发语言。

自 2015 年开始,阿里巴巴开始调研开源流计算引擎,最终决定基于 Flink 打造新一代计算引擎,针对 Flink 存在的不足进行优化和改进,并且在 2019 年初将最终代码开源,也就是我们熟知的 Blink。Blink 在原来的 Flink 基础上最显著的一个贡献就是 Flink SQL 的实现。

从1.9开始,Flink 提供了两个 Table Planner 实现来执行 Table API 和 SQL 程序:Blink Planner和Old Planner,Old Planner 在1.9之前就已经存在了 Planner 的作用主要是把关系型的操作翻译成可执行的、经过优化的 Flink 任务。两种 Planner 所使用的优化规则以及运行时类都不一样。它们在支持的功能上也有些差异。

两种计划器

  • Blink 将批处理作业视作流处理的一种特例。严格来说,Table 和 DataSet 之间不支持相互转换,并且批处理作业也不会转换成 DataSet 程序而是转换成 DataStream 程序,流处理作业也一样。

  • Blink 计划器不支持 BatchTableSource,而是使用有界的 StreamTableSource 来替代。

  • 旧计划器和 Blink 计划器中 FilterableTableSource 的实现是不兼容的。旧计划器会将 PlannerExpression 下推至 FilterableTableSource,而 Blink 计划器则是将 Expression 下推。

  • 基于字符串的键值配置选项仅在 Blink 计划器中使用。

  • PlannerConfig 在两种计划器中的实现(CalciteConfig)是不同的。

  • Blink 计划器会将多sink(multiple-sinks)优化成一张有向无环图(DAG),TableEnvironment 和 StreamTableEnvironment 都支持该特性。旧计划器总是将每个sink都优化成一个新的有向无环图,且所有图相互独立。

  • 旧计划器目前不支持 catalog 统计数据,而 Blink 支持。

1.13版本Maven资源

    <properties>
        <flink.version>1.13.0</flink.version>
    </properties>

    <dependencies>
         <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-api-scala-bridge_2.11</artifactId>
            <version>${flink.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-planner-blink_2.11</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-scala_2.11</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_2.11</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-jdbc_2.11</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.ververica</groupId>
            <artifactId>flink-connector-mysql-cdc</artifactId>
            <version>1.4.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-kafka_2.11</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.ververica</groupId>
            <artifactId>flink-format-changelog-json</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-json</artifactId>
            <version>${flink.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-csv</artifactId>
            <version>${flink.version}</version>
        </dependency>
    </dependencies>

环境:TableEnvironment

功能

  1. 在内部的 catalog 中注册 Table

  2. 注册外部的 catalog

  3. 加载可插拔模块

  4. 执行 SQL 查询

  5. 注册自定义函数 (scalar、table 或 aggregation)

  6. 将 DataStream 或 DataSet 转换成 Table

  7. 持有对 ExecutionEnvironment 或 StreamExecutionEnvironment 的引用

Flink与Blink流批环境

流处理

  • Flink Stream Table Environment

  def flink_streaming_env(): StreamTableEnvironment ={
    val fsSettings: EnvironmentSettings = EnvironmentSettings.newInstance().useOldPlanner().inStreamingMode().build()
    val fsEnv: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
    val fsTableEnv: StreamTableEnvironment = StreamTableEnvironment.create(fsEnv, fsSettings)
    fsTableEnv
  }
  • Blink Stream Table Environment

  def blink_streaming_env(): StreamTableEnvironment ={
    val bsEnv: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
    val bsSettings: EnvironmentSettings = EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build()
    val bsTableEnv: StreamTableEnvironment = StreamTableEnvironment.create(bsEnv, bsSettings)
    bsTableEnv
  }

批处理

  • Flink Batch Table Environment

  def flink_batch_env(): BatchTableEnvironment ={
    val fbEnv: ExecutionEnvironment = ExecutionEnvironment.getExecutionEnvironment
    val fbTableEnv: BatchTableEnvironment = BatchTableEnvironment.create(fbEnv)
    fbTableEnv
  }
  • Blink Batch Table Environment

  def blink_batch_env(): TableEnvironment ={
    val bbSettings: EnvironmentSettings = EnvironmentSettings.newInstance().useBlinkPlanner().inBatchMode().build()
    val bbTableEnv: TableEnvironment = TableEnvironment.create(bbSettings)
    bbTableEnv
  }

数据类型

时间格式的较多,当然也有自定义的数据类型

SQL
CHARCHAR/CHAR(n)
VARCHAR / STRINGVARCHAR/VARCHAR(n)/STRING
BINARYBINARY/BINARY(n)
VARBINARY / BYTESVARBINARY/VARBINARY(n)/BYTES
DECIMALDECIMAL/DECIMAL(p)/DECIMAL(p, s)/DEC/DEC(p)/DEC(p, s)/NUMERIC/NUMERIC(p)/NUMERIC(p, s)
TINYINTTINYINT
INTINT/INTEGER
BIGINTBIGINT
FLOATFLOAT
DOUBLEDOUBLE/DOUBLE PRECISION
DATEDATE
TIMETIME/TIME(p)
TIMESTAMPTIMESTAMP/TIMESTAMP(p)/TIMESTAMP WITHOUT TIME ZONE/TIMESTAMP(p) WITHOUT TIME ZONE
TIMESTAMP WITH TIME ZONETIMESTAMP WITH TIME ZONE/TIMESTAMP(p) WITH TIME ZONE
TIMESTAMP_LTZTIMESTAMP_LTZ/TIMESTAMP_LTZ(p)/TIMESTAMP WITH LOCAL TIME ZONE/TIMESTAMP(p) WITH LOCAL TIME ZONE
INTERVAL YEAR TO MONTHINTERVAL YEAR/INTERVAL YEAR(p)/INTERVAL YEAR(p) TO MONTH/INTERVAL MONTH
INTERVAL DAY TO SECONDINTERVAL DAY/INTERVAL DAY(p1)/INTERVAL DAY(p1) TO HOUR/INTERVAL DAY(p1) TO MINUTE/INTERVAL DAY(p1) TO SECOND(p2)/INTERVAL HOUR/INTERVAL HOUR TO MINUTE/INTERVAL HOUR TO SECOND(p2)/INTERVAL MINUTE/INTERVAL MINUTE TO SECOND(p2)/INTERVAL SECOND/INTERVAL SECOND(p2)
ARRAYARRAY< t>/ t ARRAY
MAPMAP<kt, vt>
MULTISETMULTISET < t>/t MULTISET
ROWROW<n0 t0, n1 t1, ...>
BOOLEANBOOLEAN
NULLNULL

创建表

临时表(Temporary Table)

临时表通常保存于内存中并且仅在创建它们的 Flink 会话持续期间存在。这些表对于其它会话是不可见的。它们不与任何 catalog 或者数据库绑定但可以在一个命名空间(namespace)中创建。即使它们对应的数据库被删除,临时表也不会被删除。

val sql=
      """
        |CREATE TEMPORARY TABLE users (
        |    id BIGINT,
        |    name STRING,
        |    age INT
        |) WITH (
        |    'connector' = 'xxxx'
        |)
        |""".stripMargin

永久表(Permanent Table)

永久表需要 catalog(例如 Hive Metastore)以维护表的元数据。一旦永久表被创建,它将对任何连接到 catalog 的 Flink 会话可见且持续存在,直至被明确删除

val sql=
      """
        |CREATE TABLE users (
        |    id BIGINT,
        |    name STRING,
        |    age INT
        |) WITH (
        |    'connector' = 'xxxx'
        |)
        |""".stripMargin

支持的连接资源一览

NameVersionSourceSink
FilesystemBounded and Unbounded Scan, Lookup Streaming Sink, Batch Sink
Elasticsearch6.x & 7.xNot supportedStreaming Sink, Batch Sink
Apache Kafka0.10+Unbounded ScanStreaming Sink, Batch Sink
Amazon Kinesis Data StreamsUnbounded ScanStreaming Sink
JDBCBounded Scan, LookupStreaming Sink, Batch Sink
Apache HBase1.4.x & 2.2.x Bounded Scan, LookupStreaming Sink, Batch Sink
Apache HiveSupported VersionsUnbounded Scan, Bounded Scan, LookupStreaming Sink, Batch Sink

注意:数据资源如果没有开发需要的?别着急,可以自定义

创建数据源表

环境初始化

  // flink环境
  private var bsEnv: StreamExecutionEnvironment = _
  // 流处理table环境
  private var tableEnv: StreamTableEnvironment = _
  // 批处理table环境
  private var tableBatchEnv: TableEnvironment = _

  def init_environment(): Unit ={
    bsEnv=StreamExecutionEnvironment.getExecutionEnvironment
    // 流处理
    val bsSettings: EnvironmentSettings = EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build()
    tableEnv=StreamTableEnvironment.create(bsEnv, bsSettings)
    // 批处理
    val bbSettings: EnvironmentSettings = EnvironmentSettings.newInstance().useBlinkPlanner().inBatchMode().build()
    tableBatchEnv=TableEnvironment.create(bbSettings)
  }

CSV

 def fromFilesystemWithCSV(): Unit ={
    val sql=
      """
        |CREATE TABLE users (
        |    id BIGINT,
        |    name STRING,
        |    age INT
        |) WITH (
        |    'connector' = 'filesystem',
        |    'path' = 'xxx\xx\something.csv',
        |    'format' = 'csv'
        |)
        |""".stripMargin

    tableBatchEnv.executeSql(sql)
    tableBatchEnv.executeSql("select * from users").print()
  }

Kafka

  • kafka基本

  // kafka基础
  def fromKafkaWithBasic(): Unit ={
    val kafka_sql=
      """
        |CREATE TABLE users (
        |  id BIGINT,
        |  name STRING,
        |  age INT
        |) WITH (
        |  'connector' = 'kafka',
        |  'topic' = 'testtopic',
        |  'properties.bootstrap.servers' = 'xxxxxxxx',
        |  'format' = 'json'
        |)
        |""".stripMargin
    tableEnv.executeSql(kafka_sql)
    tableEnv.executeSql("select * from users").print()
  }
  • 可用的kafka元数据操作

  def fromKafkaWithMetadata(): Unit ={
   val kafka_with_metadata=
      """
        |CREATE TABLE users (
        |  event_time TIMESTAMP(3) METADATA FROM 'timestamp',
        |  partition BIGINT METADATA VIRTUAL,
        |  offset BIGINT METADATA VIRTUAL,
        |  id BIGINT,
        |  name STRING,
        |  age INT
        |) WITH (
        |  'connector' = 'kafka',
        |  'topic' = 'testtopic',
        |  'properties.group.id' = 'testGroup',
        |  'properties.bootstrap.servers' = 'xxxxxxx',
        |  'format' = 'json'
        |)
        |""".stripMargin

    tableEnv.executeSql(kafka_with_metadata)
    tableEnv.executeSql("select partition,offset,id,age,name from users").print()
    }

元信息列

您可以在源表中定义元信息列,以获取Kafka消息的元信息。例如,当WITH参数中定义了多个topic时,如果在Kafka源表中定义了元信息列,那么Flink读取到的数据就会被标识是从哪个topic中读取的数据

Key数据类型说明
topicSTRING NOT NULL METADATA VIRTUALKafka消息所在的Topic名称。
partitionINT NOT NULL METADATA VIRTUALKafka消息所在的Partition ID。
headersMAP<STRING, BYTES> NOT NULL METADATA VIRTUALKafka消息的消息头(header)。
leader-epochINT NOT NULL METADATA VIRTUALKafka消息的Leader epoch。
offsetBIGINT NOT NULL METADATA VIRTUALKafka消息的偏移量(offest)。
timestampTIMESTAMP(3) WITH LOCAL TIME ZONE NOT NULL METADATA VIRTUALKafka消息的时间戳。
timestamp-typeSTRING NOT NULL METADATA VIRTUALKafka消息的时间戳类型:NoTimestampType:消息中没有定义时间戳CreateTime:消息产生的时间。LogAppendTime:消息被添加到Kafka Broker的时间。

WITH参数

参数说明是否必选数据类型
connector源表类型。是String
topictopic名称。是String
topic-pattern匹配读取topic名称的正则表达式。所有匹配该正则表达式的topic在作业运行时均会被订阅。否String
properties.bootstrap.serversKafka Broker地址。是String
properties.group.idKafka消费组ID。是String
properties.*Kafka配置。否String
formatFlink Kafka Connector在反序列化来自Kafka的消息体(value)时使用的格式。是String
value.formatFlink Kafka Connector在反序列化来自Kafka的消息体(value)时使用的格式。是String
key.format反序列化Kafka消息键(key)时使用的格式。否String
key.fieldsKafka消息键(key)解析出来的数据存放的字段。否String
key.fields-prefix为所有Kafka消息键(Key)指定自定义前缀,以避免与消息体(Value)格式字段重名。否String
value.fields-include在解析消息体时,是否要包含消息键字段。否String
scan.startup.modeKafka读取数据的启动位点。否String
scan.startup.specific-offsets在specific-offsets启动模式下,指定每个分区的启动偏移量。否String
scan.startup.timestamp-millis在timestamp启动模式下,指定启动位点时间戳。否Long

以上以kafka和filesystem为例,其他可以参考官网

创建数据结果表

create table kafka_sink(  
  user_id BIGINT,
  item_id BIGINT,
  category_id BIGINT,
  behavior STRING,
  ts TIMESTAMP(3)        
) with (
  'connector' = 'kafka',
  'topic' = '<yourTopicName>',
  'properties.bootstrap.servers' = '<yourKafkaBrokers>',
  'format' = 'csv'
)

WITH参数

参数说明是否必选数据类型
connector结果表类型是STRING
topic结果表对应的Topic是STRING
properties.bootstrap.serversKafka Broker地址是STRING
formatFlink Kafka Connector在反序列化来自Kafka的消息时使用的格式。是STRING
sink.partitioner从Flink分区到Kafka分区的映射模式。否STRING

小案例从csv文件读取落到mysql

def fromCSVToJDBC(): Unit ={

    val sql_csv=
      """
        |CREATE TABLE person (
        |    id BIGINT,
        |    name STRING,
        |    age INT
        |) WITH (
        |    'connector' = 'filesystem',
        |    'path' = 'xxx\xxx\something.csv',
        |    'format' = 'csv'
        |)
        |""".stripMargin

    tableBatchEnv.executeSql(sql_csv)

    val sql=
      """
        |CREATE TABLE users (
        |  id BIGINT,
        |  name STRING,
        |  age INT,
        |  PRIMARY KEY (id) NOT ENFORCED
        |) WITH (
        |   'connector' = 'jdbc',
        |   'username' = 'root',
        |   'password' = 'root',
        |   'url' = 'jdbc:mysql://localhost:3306/test?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC',
        |   'driver'='com.mysql.cj.jdbc.Driver',
        |   'table-name' = 'users'
        |)
        |""".stripMargin

    tableBatchEnv.executeSql(sql)
    tableBatchEnv.executeSql("insert into users select id,name,age from person")
  }

创建数据维表

CREATE TABLE filesystem_dim (
  id STRING,
  name STRING
) WITH (
  'connector' = 'filesystem',
  'path' = 'csv/json/avro/parquet/orc/raw',
  'format' = 'CSV' 
)

WITH 参数

参数说明是否必选备注
connector维表类型是固定值为filesystem。
path文件路径是URI格式,例如:oss://my_path/my_file。
format文件格式是参数取值如下:CSV/JSON/AVRO/PARQUET/ORC/RAW
lookup.join.cache.ttl重新读取数据的TTL时间否默认值为60分钟,即每隔60分钟重新读取数据。

代码示例

--创建event源表
CREATE TABLE event (
  id STRING, 
  data STRING
) WITH (
  'connector' = 'datahub'
   ...
);

--创建white_list维表。
CREATE TABLE white_list (
  id STRING,
  name STRING,
) WITH (
  'connector' = 'filesystem',
  'path' = '${remote_path_uri}',
  'format' = '${format}'
);

--关联event源表和white_list维表。
SELECT e.*, w.*
FROM event AS e
JOIN white_list FOR SYSTEM_TIME AS OF proctime() AS w
ON e.id = w.id;

本篇总结

本篇向大家介绍了 Flink SQL的入门简介,并没有细究原理与实现逻辑。就是先让大家对Flink SQL先有一个直观的体验。先有兴趣才有深究的动力,未完待续......

 

大数据左右手

技术如同手中的水有了生命似的,汇聚在了一起。作为大数据开发工作者,致力于大数据技术的学习与工作,分享大数据原理、架构、实时、离线、面试与总结,分享生活思考与读书见解。总有适合你的那一篇。

关注公众号!!!

和我联系吧,加群交流大数据知识,一起成长~~~

Flink SQL:Queries(Window Top-N) 阅读详情

相关推荐

Flink 最锋利的武器:Flink SQL 入门和实战带你了解NBA球星数据

一、Flink SQL 背景 Flink SQL 是 Flink 实时计算为简化计算模型,降低用户使用实时计算门槛而设计的一套符合标准 SQL 语义的开发语言。 自 2015 年开始,阿里巴巴开始调研开源流计算引擎,最终决定基于 Flink 打造新一代计算引擎,针对 Flink 存在的不足进行优化和改进,并且在 2019 年初将最终代码开源,也就是我们熟知的 Blink。Blink 在原来的 Flink 基础上最显著的一个贡献就是 Flink SQL 的实现。 Flink SQL 是面向用户.

马小婧QAQ 1149

29.flink table api 之 time Attributes

time Attributes主要分为:processing time 和event time这个概念相比大家并不陌生。time Attributes翻译成时间属性是不合适的,容易对初入门的人产生误导,我个人觉得翻译成时间特性比较好,也刚方便理解。时间特性是一种特殊的时间属性,并不是所有的时间属性都是时间特性。or aDataStream翻译:时间属性可以是每个表shcema的一部分。它们在从CREATE table DDL或DataStream创建表时定义。

笔生花的博客 2093

深入解析Flink LookupJoin:从SQL优化到Rule实战

本文深入解析了Flink LookupJoin的核心原理与应用。通过对比常规Join、Interval Join和Temporal Join,阐明LookupJoin在处理时间语义下如何高效关联动态维表,避免状态爆炸。文章详细剖析了从SQL解析、Calcite优化器Rule匹配到物理算子生成的完整优化链路,并提供了自定义Rule开发与性能调优的实战指南,帮助开发者掌握这一关键流处理技术。

weixin_29066781的博客 265

FlinkSQL 时间戳格式化时间

注意时间戳 10位 和 13位 的区别,一个是秒时间戳,一个是毫秒时间戳。

SunTecTec 2174

flinksql下的时间日期格式转换

flinksql里面最常用的事情就是时间格式转换,比如各种时间格式转换成TIMESTAMP(3).

科学的N次方 1万+

Apache Flink:实时数据流处理的终极武器

Apache Flink 以其强大的实时数据处理能力,成为大数据时代不可或缺的技术之一。从实时风控到智能推荐,从物联网监控到 AI 预测,Flink 正在驱动企业进入真正的实时计算时代。

Echo_Wish 731

Flink 最锋利的武器:Flink SQL 入门和实战

一、Flink SQL 背景Flink SQL 是 Flink 实时计算为简化计算模型,降低用户使用实时计算门槛而设计的一套符合标准 SQL 语义的开发语言。自 2015...

微信搜:import_bigdata,大数据领域硬核原创作者 8万+

OBS技术深度剖析:从开源直播工具到专业制作引擎的进化之路

本文深入剖析了开源直播软件OBS的技术架构与发展历程。从2012年诞生至今,OBS已成长为直播领域的事实标准,其成功源于模块化设计和开源协作模式。文章详细解析了OBS的核心技术:1) 分层架构与插件系统,2) GPU加速的渲染管线,3) 智能音频处理,4) 多平台编码优化。同时探讨了虚拟摄像头、浏览器源等高级功能的实现原理,并提供了性能优化方案和硬件配置建议。随着AI、WebRTC等新技术发展,OBS将持续引领实时内容创作工具的创新,为开发者和创作者提供更强大的技术支持。

程序猿老樊的博客 332

Flink最锋利的武器:Flink SQL入门和实战 | 附完整实现代码

作者 | 机智的王知无转载自大数据技术与架构(ID: import_bigdata)一、Flink SQL 背景Flink SQL 是 Flink 实时计算为简化计算模型...

AI科技大本营 5344

shader基于高度的权重混合

效果图: 基于高度的权重混合 , 效果描述: (1)混合:三层混合, 例如 第一层是草,第二层是石头,第三层是沙子,三者混合显示 (2)权重: 三层的权重的和 为1, 三者是此消彼长的关系 (3)高度:高度会限制或者说是 束缚 着 效果 关于混合,再多说几句: (1)基于权重的混合:权重 ,跟顺序没有关系 只跟权重的大小有关系(在一层一层界限不清晰的地方,特别适用!!效果极好!!!!) (2)基于叠加的混合: 叠加 就是 一层一层的往上加。。。。 所以顺序特别重要(在雪地等效果中使用:因为

木马人 1119

IC面试常考题 Verilog三分频电路设计(占空比50%,三分之一,三分之二)

实现三分频电路最简单的是: 利用计数器实现。 时序图分析(本人比较懒,平常科研忙,所以直接手画时序图了,懒得用软件画了): 直接上图分析:利用计数器每隔三个周期信号翻转一次,同时在不同的计数下翻转得到的同步信号 clk_1和clk_2,再利用异或即可实现出一个不同占空比的三分频信号(同样的方法也可扩展到其他奇数分频设计中)。 例如占空比50%: module Div_three( input clk, input rst_n, output div_three ); reg

qq_41884662的博客 1万+

Flink 最锋利的武器:Flink SQL 入门和实战(1.9版本及以后)

从1.9开始,Flink 提供了两个 Table Planner 实现来执行 Table API 和 SQL 程序:Blink Planner和Old Planner,Old Planner 在1.9之前就已经存在了 Planner 的作用主要是把关系型的操作翻译成可执行的、经过优化的 Flink 任务。两种 Planner 所使用的优化规则以及运行时类都不一样。它们在支持的功能上也有些差异。 两种计划器 Blink 将批处理作业视作流处理的一种特例。严格来说,Table 和 DataSet 之间不支持相互

微信搜:import_bigdata,大数据领域硬核原创作者 2447

OpenSpec 从入门到精通:AI 时代的最佳 SDD 范式

同样都是「先写规范再写代码」的开源 SDD 框架,OpenSpec(https://github.com/fission-ai/openspec) 展现出了极高的工程性价比,无论是使用 Claude Code、Cursor 还是 Aider,都可以无缝接入 OpenSpec 的规格管理层。这些问题需要人来做判断,AI 做不了这个主。整个流程跑下来,OpenSpec 产出的效果还是令人满意的,一些前期没有考虑到的细节 AI 都补上了,生成的相关文档也有利于开发人员的知识对齐,可以尝试在团队内部推广。

qq_39093474的博客 934

轻松通关Flink开篇词:实时计算领域最锋利的武器 Flink

你好,欢迎来到 Flink 专栏,我是王知无,目前在某一线互联网公司从事数据平台架构和研发工作多年,算是整个大数据开发领域的老兵了。我最早从 Release 版本开始关注 Flink,可以说是国内第一批钻研 Flink 的开发者,后来基于 Flink 开发过实时计算业务应用、实时数据仓库以及监控报警系统,在这个过程中积累了大量宝贵的生产实践经验。面试是开发者永远绕不过去的坎由于项目需要,我在工作中面试过很多 Flink 开发工程师,并且发现了一些普遍性问题,比如:对常用的 Flink。

sucaiwa的博客 362

宇树G1嵌入式软件架构及技术实现

该架构通过硬件加速(FPGA)+确定性调度(RTX5)的组合,在1ms控制周期内完成从传感器采集到43轴输出的全链路处理,相比波士顿动力系统缩短40%的着地稳定时间。,结合ARM Cortex-R5与FPGA的异构计算能力,实现43自由度1kHz实时控制。

m0_60674045的博客 4311

顶级AI大模型白嫖ChatGPT Plus1个月,0成本薅顶配功能

Chat*** Plus限时免费1个月!原价20美元/月的顶配功能

BUG猿的博客 7291

8.sql和hsql以及flink-sql总结

文章目录1. SQL1.1. 初始化操作1.2. 数据定义语言DDL(==Data Definition Language==)1.3. 数据操纵语言DML(==Data Manipulation Language==)1.4. 数据查询语言DQL(==Data Query Language==)1.5. 数据控制语言DCL(==Data Control Language==)2. HQL3. F...

2032

45、使用 sqlread 函数将数据从数据库表导入 MATLAB

本文详细介绍了如何使用 MATLAB 中的 `sqlread` 函数从不同类型的数据库(如 Microsoft SQL Server 和 SQLite)中导入数据。文章涵盖了 `sqlread` 的基本语法、输入输出参数、使用示例以及注意事项,并通过多个实例演示了自定义导入选项、元信息检索和数据类型转换等内容。此外,还总结了导入数据库数据的通用流程及最佳实践建议,帮助用户更高效地进行数据分析和处理工作。

bash7scripter的博客 134

10分钟看懂Flink SQL引擎黑科技:Planner如何让SQL跑得更快?

你是否遇到过这样的困境:明明写了"正确"的SQL,却在大数据量下慢如蜗牛?Apache Flink SQL执行引擎的Planner(规划器)和Optimizer(优化器)正是解决这类问题的核心武器。本文将用图解方式拆解这两个"幕后英雄"的工作原理,读完你将掌握: - 为什么Flink SQL比传统批处理引擎快数倍的底层逻辑 - 如何通过配置让优化器自动优化你的SQL - 看懂执行计划的3个关键指标...

gitblog_00842的博客 954

实战全解|大疆司空2二次开发:从接口开发到第三方业务系统深度融合

大疆司空2二次开发是实现行业无人机定制化应用的关键,通过OpenAPI后端对接+前端组件集成的组合方式,可快速完成功能定制,而与第三方业务系统的深度融合,能彻底打通“业务下发-设备执行-数据回传-流程闭环”的全链路,让无人机管控真正融入行业业务流程。开发过程中,建议优先采用私有版部署保障数据安全,通过中间适配层降低系统耦合度,结合实际业务场景打磨功能,避免过度开发。随着大疆开发者生态的完善,司空2的二次开发能力将持续升级,为更多行业无人机应用提供技术支撑。

2501_93651177的博客 985

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

flink sql设置并行度_干货Get:Flink的架构模型你知道么?

大家好,我是勾叔,今天邀请《大数据技术与架构》作者王知无继续和大家分享Flink的架构模型。Flink 的分层模型Flink 自身提供了不同级别的抽象来支持我们开发流式或者批量处理程序,上图描述了 Flink 支持的 4 种不同级别的抽象。对于我们开发者来说,大多数应用程序不需要上图中的最低级别的 Low-level 抽象,而是针对 Core API 编程, 比如 DataStream API(有...

weixin_39892309的博客 139

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

基于 Flink SQL CDC 数据处理的终极武器

基于 Flink SQL CDC 数据处理的终极武器。

大数据指北 2662

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Flink SQL写入MySQL避坑指南:非空列遇到null值怎么办?

本文深入探讨了Flink SQL写入MySQL时,因非空列遇到null值导致作业失败的常见问题。文章分析了问题根因,并重点介绍了核心配置参数`table.exec.sink.not-null-enforcer`的两种模式(error/drop)及其应用场景。同时,提供了从SQL清洗、维度表关联到监控告警的纵深防御策略,帮助开发者构建健壮的实时数据处理管道。

qsc901234的博客 510
上一篇: 你的数据倾斜了吗?一文帮你数据处理再均衡
下一篇: FlinkSQL窗口,让你眼前一亮,是否可以大吃一惊呢
大数据左右手
博客等级 码龄9年 475粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值