FlinkSQL窗口,让你眼前一亮,是否可以大吃一惊呢

Flink-SQL 设置水位线(Watermark)和开窗(window)示例 代码 import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.table.api.Table; import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; 阅读详情

 

前言

Flink SQL的窗口操作在straming的实现上增添了不少东西。是用起来越来越方便。本篇主要内容:

  • Watermark

  • 滚动窗口

  • 滑动窗口

  • 累积窗口函数

  • 窗口分组聚合GROUPING SETS

  • Clue幂集函数

  • Over函数

Watermark

引入

由于实时计算的输入数据是持续不断的,因此我们需要一个有效的进度指标,来帮助我们确定关闭时间窗口的正确时间点,保证关闭窗口后不会再有数据进入该窗口,可以安全输出这个窗口的聚合结果。

而Watermark就是一种衡量Event Time进展的有效机制。随着时间的推移,最早流入实时计算的数据会被处理完成,之后流入的数据处于正在处理状态。处于正在处理部分的和已处理部分的交界的时间戳,可以被定义为Watermark,代表在此之前的事件已经被处理完成并输出。

针对乱序的流,Watermark也至关重要,即使部分事件延迟到达,也不会影响窗口计算的正确性。此外,并行数据流中,当算子(Operator)有多个输入流时,算子的Event Time以最小流Event Time为准。

具体可参考Flink Straming的原理介绍:

Flink的窗口、时间语义,Watermark机制,多代码案例详解,Flink学习入门(三)

watermark策略

Flink SQL提供了几种常用的watermark策略。

  1. 严格意义上递增的时间戳,发出到目前为止已观察到的最大时间戳的水印。时间戳小于最大时间戳的行不会迟到。watermark for rowtime_column as rowtime_column

  2. 递增的时间戳,发出到目前为止已观察到的最大时间戳为负1的水印。时间戳等于或小于最大时间戳的行不会迟到。watermark for rowtime_column as rowtime_column - INTERVAL '1' SECOND.

  3. 有界时间戳(乱序)发出水印,它是观察到的最大时间戳减去指定的延迟, 例如,watermark for rowtime_column as rowtime_column - INTERVAL'5'SECOND是5秒的延迟水印策略。watermark for rowtime_column as rowtime_column - INTERVAL 'string' timeUnit.

现常用的语法

watermark [watermarkName] for <rowtime_field> as withOffset(<rowtime_field>, offset)

参数是否必填说明
watermarkName否标识Watermark的名字。
<rowtime_field>是<rowtime_field>必须是表中已定义的一列(当前仅支持TIMESTAMP类型),基于该列生成Watermark,并且标识该列为Event Time列。您可以使用<rowtime_field>在作业代码中定义窗口。
withOffset是Watermark的生成策略,根据<rowtime_field> - offset生成Watermark的值。withOffset的第一个参数必须是<rowtime_field>。
offset是Watermark值与Event Time值的偏移量,单位为毫秒。

窗口函数

滚动窗口

滚动窗口(TUMBLE)将每个元素分配到一个指定大小的窗口中。通常,滚动窗口有一个固定的大小,并且不会出现重叠。例如,如果指定了一个5分钟大小的滚动窗口,无限流的数据会根据时间划分为[0:00, 0:05)、[0:05, 0:10)、[0:10, 0:15)等窗口。

语法

TUMBLE函数用在GROUP BY子句中,用来定义滚动窗口。TUMBLE(< time-attr>, < size-interval>) < size-interval>: INTERVAL 'string' timeUnit

< time-attr>参数必须是时间流中的一个合法的时间属性字段

标识函数

使用标识函数选出窗口的起始时间或者结束时间,窗口的时间属性用于下级Window的聚合

窗口标识函数返回类型描述
TUMBLE_START(time-attr, size-interval)TIMESTAMP返回窗口的起始时间(包含边界)。例如[00:10,00:15)窗口,返回00:10
TUMBLE_END(time-attr, size-interval)TIMESTAMP返回窗口的结束时间(包含边界)。例如[00:00, 00:15]窗口,返回00:15。
TUMBLE_ROWTIME(time-attr, size-interval)TIMESTAMP(rowtime-attr)返回窗口的结束时间(不包含边界)。例如[00:00, 00:15]窗口,返回00:14:59.999。返回值是一个rowtime attribute,即可以基于该字段做时间属性的操作,例如,级联窗口只能用在基于Event Time的Window上,详情请参见级联窗口。
TUMBLE_PROCTIME(time-attr, size-interval)TIMESTAMP(rowtime-attr)返回窗口的结束时间(不包含边界)。例如[00:00, 00:15]窗口,返回00:14:59.999。返回值是一个Proctime Attribute,即可以基于该字段做时间属性的操作。例如,级联窗口只能用在基于Processing Time的Window上,详情请参见级联窗口。

新版本语法(简洁)

TUMBLE(TABLE data, DESCRIPTOR(timecol), size)

  • data: 是一个表参数。

  • timecol: 是一个列描述符指示应该映射到哪个时间的属性列。

  • size: 是一个持续时间指定窗口的宽度。

滑动窗口

滑动窗口(HOP),也被称作Sliding Window。不同于滚动窗口,滑动窗口的窗口可以重叠。

通常,大部分元素符合多个窗口情景,窗口是重叠的。因此,滑动窗口在计算移动平均数(moving averages)时很实用。例如,计算过去5分钟数据的平均值,每10秒钟更新一次,可以设置slide为10秒,size为5分钟。下图为您展示间隔为30秒,窗口大小为1分钟的滑动窗口。

语法

下面不再介绍之前版本的写法,按1.13版本来 HOP(TABLE data, DESCRIPTOR(timecol), slide, size [, offset ])

  • data: 是一个表参数,数据表。

  • timecol: 是一个列描述符指示应该映射到哪个时间的属性列。

  • slide: 滑动时间。

  • size: 是一个持续时间指定窗口的宽度。

累积窗口函数

累积窗口在某些情况下非常有用,例如在固定的窗口间隔内早期触发的滚动窗口。例如,每日从00:00到每分钟累计计算UV值,10:00的UV值表示00:00到10:00的UV总数。这可以通过累积窗口轻松有效地实现。

累积函数将元素分配给窗口,这些窗口在初始步长间隔内覆盖行,并在每一步扩展到一个更多的步长(保持窗口开始固定),直到最大窗口大小。你可以把累积函数看作是先应用具有最大窗口大小的滚动窗口,然后把每个滚动窗口分成几个窗口,每个窗口的开始和结束都有相同的步长差。所以累积窗口确实有重叠,而且没有固定的大小

例如,你可以对1小时的步长和1天的最大长度有一个累积窗口,你就会得到窗口 [00:00, 01:00), [00:00, 02:00), [00:00, 03:00), …, [00:00, 24:00)

语法

CUMULATE(TABLE data, DESCRIPTOR(timecol), step, size)

  • data: 是一个表参数,数据表。

  • timecol: 是一个列描述符指示应该映射到哪个时间的属性列。

  • step: 步长

  • size: 是一个持续时间指定窗口的宽度!

以此为例:数据:goods

timepriceitem
2020-04-15 08:054.00C
2020-04-15 08:072.00A
2020-04-15 08:095.00D
2020-04-15 08:113.00B
2020-04-15 08:131.00E
2020-04-15 08:176.00F
SELECT window_start, window_end, SUM(price)
  FROM TABLE(
    CUMULATE(TABLE goods, DESCRIPTOR(time), INTERVAL '2' MINUTES, INTERVAL '10' MINUTES))
  GROUP BY window_start, window_end
window_startwindow_endprice
2020-04-15 08:002020-04-15 08:064.00
2020-04-15 08:002020-04-15 08:086.00
2020-04-15 08:002020-04-15 08:1011.00
2020-04-15 08:102020-04-15 08:123.00
2020-04-15 08:102020-04-15 08:144.00
2020-04-15 08:102020-04-15 08:164.00
2020-04-15 08:102020-04-15 08:1810.00
2020-04-15 08:102020-04-15 08:2010.00

窗口分组聚合GROUPING SETS

窗口聚合也支持分组集语法。分组集允许更复杂的分组标准比描述所GROUP by操作。指定行分别分组,每个分组集和聚合计算每组一样简单的group by子句 与下面相同 ROLLUP 汇总是一种速记符号用于指定一个常见类型的分组集。它代表给定的表达式和所有前缀列表的列表,包括空列表。      窗口与汇总需要聚合window_start和window_end列必须在GROUP BY子句,但不是在ROLLUP中条款。

val kafka_sql=
      """
        |CREATE TABLE goods (
        |  item_id VARCHAR,
        |  item_type VARCHAR,
        |  event_time varchar,
        |  on_sell_time AS TO_TIMESTAMP(event_time),
        |  price DOUBLE,
        |  WATERMARK FOR on_sell_time AS on_sell_time - INTERVAL '1' SECOND
        |) WITH (
        |  'connector' = 'kafka',
        |  'topic' = 'testtopic',
        |  'properties.bootstrap.servers' = 'xxxxxx',
        |  'format' = 'json'
        |)
        |""".stripMargin
    tableEnv.executeSql(kafka_sql)

    val query=
      """
        |SELECT window_start, window_end, item_type, SUM(price) as price
        |  FROM TABLE(
        |    TUMBLE(TABLE goods, DESCRIPTOR(on_sell_time), INTERVAL '5' MINUTES))
        |  GROUP BY window_start, window_end, GROUPING SETS ((item_type), ())
        |""".stripMargin
        
        或者
       
      val query=
      """
        |SELECT window_start, window_end, item_type, SUM(price) as price
        |  FROM TABLE(
        |    TUMBLE(TABLE goods, DESCRIPTOR(on_sell_time), INTERVAL '5' MINUTES))
        |  GROUP BY window_start, window_end, ROLLUP (item_type)
        |""".stripMargin


tableEnv.executeSql(query).print()
        

数据源write(item)方法后发送kafka的消息

def test_over_window(): Array[AnyRef] ={
    Array(
      Map(
        "item_id"->"ITEM001",
        "item_type"->"apple",
        "event_time"->"2020-04-15 10:01:00",
        "price"->20
      ),
      Map(
        "item_id"->"ITEM002",
        "item_type"->"apple",
        "event_time"->"2020-04-15 10:02:00",
        "price"->50
      ),
      Map(
        "item_id"->"ITEM003",
        "item_type"->"apple",
        "event_time"->"2020-04-15 10:03:00",
        "price"->30
      ),
      Map(
        "item_id"->"ITEM004",
        "item_type"->"apple",
        "event_time"->"2020-04-15 10:04:00",
        "price"->60
      ),
      Map(
        "item_id"->"ITEM005",
        "item_type"->"apple",
        "event_time"->"2020-04-15 10:05:00",
        "price"->40
      ),
      Map(
        "item_id"->"ITEM006",
        "item_type"->"apple",
        "event_time"->"2020-04-15 10:06:00",
        "price"->20
      ),
      Map(
        "item_id"->"ITEM007",
        "item_type"->"apple",
        "event_time"->"2020-04-15 10:07:00",
        "price"->10
      ),
      Map(
        "item_id"->"ITEM008",
        "item_type"->"orange",
        "event_time"->"2020-04-15 10:08:00",
        "price"->20
      ),
      Map(
        "item_id"->"ITEM009",
        "item_type"->"orange",
        "event_time"->"2020-04-15 10:09:00",
        "price"->21
      ),
      Map(
        "item_id"->"ITEM010",
        "item_type"->"apple",
        "event_time"->"2020-04-15 10:10:00",
        "price"->22
      ),
      Map(
        "item_id"->"ITEM011",
        "item_type"->"orange",
        "event_time"->"2020-04-15 10:11:00",
        "price"->26
      )
    )
  }

结果:

window_startwindow_enditem_typeprice
2020-04-15 10:00:00.0002020-04-15 10:05:00.000apple160.0
2020-04-15 10:00:00.0002020-04-15 10:05:00.000(NULL)160.0
2020-04-15 10:05:00.0002020-04-15 10:10:00.000apple70.0
2020-04-15 10:05:00.0002020-04-15 10:10:00.000orange41.0
2020-04-15 10:05:00.0002020-04-15 10:10:00.000(NULL)111.0

CUBE

CUBE是一种用于指定公共分组集类型的简写符号。它表示给定的列表及其所有可能的子集——幂集

def cube(): Unit ={
    val kafka_sql=
      """
        |CREATE TABLE goods (
        |  item_id VARCHAR,
        |  item_type VARCHAR,
        |  event_time varchar,
        |  on_sell_time AS TO_TIMESTAMP(event_time),
        |  price DOUBLE,
        |  WATERMARK FOR on_sell_time AS on_sell_time - INTERVAL '1' SECOND
        |) WITH (
        |  'connector' = 'kafka',
        |  'topic' = 'testtopic',
        |  'properties.bootstrap.servers' = 'xxxxx',
        |  'format' = 'json'
        |)
        |""".stripMargin
    tableEnv.executeSql(kafka_sql)

    val query=
      """
        |SELECT window_start, window_end,item_id, item_type, SUM(price) as price
        |  FROM TABLE(
        |    TUMBLE(TABLE goods, DESCRIPTOR(on_sell_time), INTERVAL '5' MINUTES))
        |  GROUP BY window_start, window_end, CUBE(item_id,item_type)
        |""".stripMargin

    tableEnv.executeSql(query).print()
    
    }

数据源write(item)方法后发送kafka的消息

def test_clue(): Array[AnyRef] ={
    Array(
      Map(
        "item_id"->"ITEM001",
        "item_type"->"apple",
        "event_time"->"2020-04-15 10:01:00",
        "price"->20
      ),
      Map(
        "item_id"->"ITEM001",
        "item_type"->"apple",
        "event_time"->"2020-04-15 10:02:00",
        "price"->50
      ),
      Map(
        "item_id"->"ITEM001",
        "item_type"->"apple",
        "event_time"->"2020-04-15 10:03:00",
        "price"->30
      ),
      Map(
        "item_id"->"ITEM001",
        "item_type"->"apple",
        "event_time"->"2020-04-15 10:04:00",
        "price"->60
      ),
      Map(
        "item_id"->"ITEM001",
        "item_type"->"apple",
        "event_time"->"2020-04-15 10:05:00",
        "price"->40
      ),
      Map(
        "item_id"->"ITEM002",
        "item_type"->"apple",
        "event_time"->"2020-04-15 10:06:00",
        "price"->20
      ),
      Map(
        "item_id"->"ITEM002",
        "item_type"->"apple",
        "event_time"->"2020-04-15 10:07:00",
        "price"->10
      ),
      Map(
        "item_id"->"ITEM002",
        "item_type"->"orange",
        "event_time"->"2020-04-15 10:08:00",
        "price"->20
      ),
      Map(
        "item_id"->"ITEM002",
        "item_type"->"orange",
        "event_time"->"2020-04-15 10:09:00",
        "price"->21
      ),
      Map(
        "item_id"->"ITEM02",
        "item_type"->"apple",
        "event_time"->"2020-04-15 10:10:00",
        "price"->22
      ),
      Map(
        "item_id"->"ITEM02",
        "item_type"->"orange",
        "event_time"->"2020-04-15 10:11:00",
        "price"->26
      )
    )
  }

结果:

window_startwindow_enditem_iditem_typeprice
2020-04-15 10:00:00.0002020-04-15 10:05:00.000(NULL)apple140.0
2020-04-15 10:00:00.0002020-04-15 10:05:00.000ITEM001apple140.0
2020-04-15 10:00:00.0002020-04-15 10:05:00.000ITEM001(NULL)140.0
2020-04-15 10:00:00.0002020-04-15 10:05:00.000(NULL)(NULL)140.0
2020-04-15 10:05:00.0002020-04-15 10:10:00.000(NULL)apple70.0
2020-04-15 10:05:00.0002020-04-15 10:10:00.000ITEM001apple40.0
2020-04-15 10:05:00.0002020-04-15 10:10:00.000ITEM001(NULL)40.0
2020-04-15 10:05:00.0002020-04-15 10:10:00.000ITEM002orange41.0
2020-04-15 10:05:00.0002020-04-15 10:10:00.000(NULL)orange41.0
2020-04-15 10:05:00.0002020-04-15 10:10:00.000ITEM002(NULL)71.0
2020-04-15 10:05:00.0002020-04-15 10:10:00.000(NULL)(NULL)111.0
2020-04-15 10:05:00.0002020-04-15 10:10:00.000ITEM002apple30.0

over函数

以窗口Top N为例子

 def top_n: Unit ={
    val kafka_sql=
      """
        |CREATE TABLE goods (
        |  item_id VARCHAR,
        |  item_type VARCHAR,
        |  event_time varchar,
        |  on_sell_time AS TO_TIMESTAMP(event_time),
        |  price DOUBLE,
        |  WATERMARK FOR on_sell_time AS on_sell_time - INTERVAL '1' SECOND
        |) WITH (
        |  'connector' = 'kafka',
        |  'topic' = 'testtopic',
        |  'properties.bootstrap.servers' = 'xxxxx',
        |  'format' = 'json'
        |)
        |""".stripMargin
    tableEnv.executeSql(kafka_sql)

    val query=
      """
        |SELECT *
        |  FROM (
        |    SELECT *, ROW_NUMBER() OVER (PARTITION BY window_start, window_end ORDER BY price DESC) as rownum
        |    FROM (
        |      SELECT window_start, window_end, item_type, SUM(price) as price, COUNT(*) as cnt
        |      FROM TABLE(
        |        TUMBLE(TABLE goods, DESCRIPTOR(on_sell_time), INTERVAL '5' MINUTES))
        |      GROUP BY window_start, window_end, item_type
        |    )
        |  ) WHERE rownum <= 2
        |""".stripMargin
    tableEnv.executeSql(query).print()
    
    }

数据源也就是上面的test_over_window通过write(item)方法后发送kafka的消息

结果:

window_startwindow_enditem_typepricecntrownum
2020-04-15 10:00:00.0002020-04-15 10:05:00.000apple160.041
2020-04-15 10:05:00.0002020-04-15 10:10:00.000apple70.031
2020-04-15 10:05:00.0002020-04-15 10:10:00.000orange41.022

总结:

在Flink SQL窗口中:累积窗口函数, 窗口分组聚合GROUPING SETS,Clue幂集函数, Over函数这些给人眼前一亮,的确是减少了开发工作量。但是需要开发工作者灵活运行才会发挥价值。知识无止境,人生也无止境。

  

大数据左右手

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

关注公众号!!!

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

FlinkSQL 水印(Watermark)的使用和编程实例 在事件流处理中,我们通常需要根据事件的发生时间进行计算和分析,而事件的发生时间并不总是与事件到达处理系统的时间一致。由于网络传输延迟、数据乱序等原因,事件的到达顺序和事件的实际发生顺序可能存在差异。为了解决这个问题,Flink 引入了水印的概念。水印是一种特殊的事件,它带有一个时间戳,并用于表示在该时间戳之前的事件已经全部到达。换句话说,水印标识了事件时间轴上的一个时间点,该时间点之前的事件都已经到达。水印的引入可以帮助我们处理乱序事件、处理延迟数据以及触发窗口计算等操作。 阅读详情

相关推荐

大数据Flink(七十八):SQL 的水印操作(Watermark)

4.后面几个以此类推,直到Event Time为:1648197590000的数据进来的时候,前一条数据的WaterMark为1648197589000,于是更新当前的WaterMark为1648197590000,Flink认为1648197590000之前的数据都已经到达,且达到了窗口的触发条件,开始进行计算。可以看到,设置了最大允许乱序时间后,WaterMark要比原来低5秒,可以对延迟5秒内的数据进行处理,窗口的触发条件也同样会往后延迟关于延迟时间,请结合业务场景进行设置。

Lansonli(蓝深李)的博客 1464

FlinkSQL的Watermark机制和Checkpoint机制

Watermark机制,就是水印机制,也叫做水位线机制。就是专门用来解决流式环境下数据迟到问题的。

sijiwang95的博客 2296

大数据Flink(一百一十八):Flink SQL水印操作(Watermark)

4.后面几个以此类推,直到Event Time为:1648197590000的数据进来的时候,前一条数据的WaterMark为1648197589000,于是更新当前的WaterMark为1648197590000,Flink认为1648197590000之前的数据都已经到达,且达到了窗口的触发条件,开始进行计算。但是由于网络、分布式等原因,会导致数据乱序的情况。通过watermark来解决,简单来说就是延迟窗口关闭的时间,等一会迟到的数据,窗口关闭不在依据数据的时间,而是到达的watermark的时间。

Lansonli(蓝深李)的博客 2901

Flink Sql 中 Watermark 使用方式

1、创建 env 和 tableEnv 环境 2、利用 Sql 定义 Source 数据源(并在数据源中定义Watermark和event-time),连接Source 3、利用滑动窗口Hop测试Watermark和event-time是否定义成功 4、利用Window TopN实现业务逻辑 val env = StreamExecutionEnvironment.getExecutionEnvironment env.setParallelism(1) val sett

Y_FC_EMBEDD的博客 6200

Flink——芒果TV的实时数仓建设实践

Flink——芒果TV的实时数仓建设实践

爱吃辣条的博客 2016

[ENVI]-[高光谱遥感]-波谱沙漏分析工具的使用

图1-2-1查看特殊波段的坏波段图1-2-2在中添加坏波段ENVI波谱沙漏分析工具MNF变换。

m0_57992372的博客 1470

AI人工智能 芒果 TV 基于 Flink 的实时数仓建设实践与演进

2. 复杂的表处理,在一些数据清洗的复杂场景中,在关联维表时,维表的数据会要经过一层甚至多层的处理才能使用,离线数仓在这种场景下,可以直接在 Join 时写多层子查询来一步到位。Flink CDC+StarRocks 的模式可以解决生产环境中很多问题, StarRocks 和 Flink 结合去构建实时数据分析体系的联合解决方案,将在一定程度上颠覆既有的一些禁锢,形成实时数据分析新范式,加速融合实时日志数据和业务数据,也能解决传统离线数据批量抽取的问题,实现了离线和实时在数据上的统一,加快流批一体的进程。

人工智能讲师分享前沿技术 295

逆变器专题(9)-基于dq坐标系的逆变器解耦控制建模与实时仿真分析

本文深入探讨了基于dq坐标系的逆变器解耦控制建模与实时仿真分析。通过生动的比喻和详细的数学推导,阐述了如何通过坐标变换和前馈补偿实现d轴与q轴的独立控制,从而提升系统动态性能与稳定性。文章还介绍了在MATLAB/Simulink中搭建仿真模型、分析动态响应与稳定性的方法,并展望了硬件在环(HIL)实时仿真的高级验证手段,为新能源并网与电机驱动领域的工程师提供了宝贵的实践指南。

gold的博客 547

2024年Flink Forward Asia 2024 - 总结和展望(附PPT下载链接),全网独家首发

三天的 FFA,感触颇深。Flink 创始人之一 Ververica CEO Kostas Tzoumas 感慨说,五年前当他们 5 个初创刚刚开始 Flink 这个项目的时候无法想象今天 Flink 能有如此大的生态和如此广的应用。虽然我无法深切体会到他的感受,但是当前 Flink 社区的繁荣和 Flink 的应用广度是有目共睹的,但更重要的问题是:未来我们如何延续这种繁荣。Flink 在经历了高性能流式引擎,批流一体两代发展后,我们确实需要思考一下未来的 Flink 是什么样的。

ghfgjfg679的博客 1583

项目管理中 PMO 的关键职能解析

在企业数字化转型与战略落地的浪潮中,PMO(Project Management Office,项目管理办公室)逐渐从“项目辅助角色”升级为“组织级战略执行中枢”。然而,多数人对PMO的认知仍停留在“管项目的部门”或“文档审核机器”的层面。本文将打破误解,通过生活化类比(如“中枢神经”“导航系统”)、流程图解(战略对齐循环)、实际案例(制造企业PMO升级),深入解析PMO的五大核心职能:战略对齐、流程标准化、资源管理、绩效监控、知识沉淀。最终揭示PMO的本质——

项目管理的博客 1254

用blender为模型贴图并在gazebo中显示

用blender为模型贴图并在gazebo中显示 首先我用的是最新的blender2.92版本,附上链接https://www.blender.org/download/。并设置好简体中文。语言可以在编辑->偏好设置->界面里面设置。 首先界面右上角的摄像头,方块,灯光三个场景全都删除。 接着导入stl格式的模型文件,下面以tianbot_mini上面的激光雷达的模型为例。 导入激光雷达模型后,点击进入上方的UV Editing按钮进入UV编辑界面 此时我面看见网格化的激光雷达模型

qq_48427527的博客 8001

PyFlink 在聚美优品的应用实践

大家好,我是来自聚美优品刷宝大数据部门的吴攀刚,本文将跟大家分享 PyFlink 在刷宝的应用,包括:背景介绍、架构演进、技术选型以及一个问题的解决思路分享。刷宝是一款短视频 APP,涵...

Ververica的博客 2855

Rust Reqwest+Rustls 自签名证书校验

所以这里必须保证reqwest引用的rustls库和本地工程一致。以上就是实现不校验签名的逻辑,后续自己可以在对应回调进行逻辑判断。

bawomingtian123的专栏 1361

【实践案例分享】PyFlink 在聚美优品的应用实践

大家好,我是来自聚美优品刷宝大数据部门的吴攀刚,本文将跟大家分享 PyFlink 在刷宝的应用,包括:背景介绍、架构演进、技术选型以及一个问题的解决思路分享。刷宝是一款短视频 APP,涵...

木东居士 738

【基于深度学习的脑电图识别】数据集篇:THE TUH EEG CORPUS: A Big Data Resource for Automated EEG Interpretation

【基于机器学习的脑电图识别】数据集篇:脑电信号自动判读的大数据摘要: 摘要: 这个数据集包括超过 25000 个脑电图研究,包括一个神经学家对测试的解释,一个简短的病人病史和关于病人的人口统计信息,如性别和年龄。这是第一次有足够的数据来支持最先进的机器学习算法的应用。在这篇论文中,我们使用了3762个语料库的会话子集,展示了从原始脑电图信号数据预测脑电图的一些基本属性的初步实验结果。在闭环测试中,...

梁瑛平的博客 5615

DeepSeek+Cline:开启自动化编程新纪元

随着 AI 技术不断进步,编程领域迎来效率变革。DeepSeek 与 Cline 的结合,成为自动化编程的强大工具。DeepSeek 凭借先进的自然语言处理能力,能精准理解编程需求;Cline 作为 VSCode 插件,可实现代码生成、调试、注释等功能的无缝衔接。本文详细阐述二者安装配置、实战操作流程,涵盖从基础代码生成到复杂项目开发的应用技巧,同时解答常见问题,帮助开发者快速掌握这对 “智能搭档”,提升编程效率,解锁自动化编程的无限可能。

邓邓子的博客 6256

芒果 TV 基于 Flink 的实时数仓建设实践

基于 Flink 技术的特点,芒果 TV 在未来的数仓建设中将注重实现湖仓一体的架构,以实现对数据的全面管理和利用。

Ververica的博客 970

【AI】获取各类AI大模型api-key的快速教程(OpenAI、Gemini、Claude、DeepSeek)

【AI】获取各类AI大模型api-key的快速教程(OpenAI、Gemini、Claude、DeepSeek)

funfan的博客 3019

Flink详解系列之五--水位线(watermark)

在进行窗口处理时,不可能无限期的等待延迟数据到达,当到达特定watermark时,认为在watermark之前的数据已经全部达到(即使后面还有延迟的数据), 可以触发窗口计算,这个机制就是 Watermark(水位线),具体如下图所示。如果水位线设置的过于宽松,好处是计算时能保证近可能多的数据被收集到,但由于此时的水位线远落后于处理记录的时间戳,导致产生的数据结果延迟较大。如果设置的水位线过于紧迫,数据结果的时效性当然会更好,但由于水位线大于部分记录的时间戳,数据的完整性就会打折扣。3.2 水位线分配器。

wr_java的博客 2656

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

FlinkSql窗口概念,及水印使用

双流join的情况下,watermark的获取方式为: 1.分别计算俩条流的watermark 2.然后比对俩条流的watermark选取小的 ->CombineWatermark = min(watermark1,watermark2) 双流join关于的Interval Join的实现 Interval Join则没有window的概念,直接用时间戳作为关联的条件,更具表达力。由于流消息的无限性以及消息乱序的影响,本应关联上的消息可能进入处理系统的时间有较大差异,一条流中的消息,可能需要和另一条流

斧王,不能再斩杀了吗的博客 1831

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Flink 1.10.0 SQL DDL中如何定义watermark和计算列

随着Flink1.10.0版本的发布,在SQL上一个重大的优化是支持了watermark语义的计算,在之前的Flink1.9.x版本中是不支持的,当时只能用SQL DDL进行proces...

JasonLee实时计算 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Flink SQL时间属性和窗口介绍 ,窗口表值函数

在创建表的 DDL(CREATE TABLE 语句)中,可以增加一个字段,通过 WATERMARK语句来定义事件时间属性。WATERMARK 语句主要用来定义水位线(watermark)的生成表达式,这个表达式会将带有事件时间戳的字段标记为事件时间属性,并在它基础上给出水位线的延迟时间。具体定义方式如下:) WITH (...把 ts 字段定义为事件时间属性,而且基于 ts 设置了 5 秒的水位线延迟。

. 3075

Flink Watermark 机制及总结

阐述 Flink 水印机制的原理和使用方式

cloudbigdata的博客 2619

flink关于watermark的测试

定义一个kafka的数据源WITH (根据计算字段event_time_watermark生成5秒延迟的watermark。

weixin_43039757的博客 457

flink watermark 生成机制与总结

watermark 介绍watermark生成方式watermark 的生成值算法策略watermark策略设置代码watermark源码分析watermark源码调用流程debug(重要)测试思路迟到时间处理FlinkSql 中的watermark引出问题与源码分析。

Direction_Wind的博客 2404
上一篇: Flink最锋利的武器Flink SQL(入门篇)
下一篇: 查询引擎怎么选?7000字解析所有开源引擎的秘密
大数据左右手
博客等级 码龄9年 475粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值