Flink04: Flink核心API之DataStream

尚硅谷大数据Flink1.17实战教程-笔记04【Flink DataStream API】 尚硅谷大数据Flink1.17实战教程-笔记04【DataStream API】 阅读详情

一、Flink 4种不同层次的API

 

Flink中提供了4种不同层次的API,每种API在简洁和易表达之间有自己的权衡,适用于不同的场景。目前上面3个会用得比较多。
        • 低级API(Stateful Stream Processing):提供了对时间和状态的细粒度控制,简洁性和易用性较差,主要应用在一些复杂事件处理逻辑上。
        • 核心API(DataStream/DataSet API):主要提供了针对流数据和批数据的处理,是对低级API进行了一些封装,提供了filter、sum、max、min等高级函数,简单易用,所以这些API在工作中应用还是比较
广泛的。
        • Table API:一般与DataSet或者DataStream紧密关联,可以通过一个DataSet或DataStream创建出一个Table,然后再使用类似于filter, join,或者 select这种操作。最后还可以将一个Table对象转成DataSet或DataStream。
        • SQL:Flink的SQL底层是基于Apache Calcite,Apache Calcite实现了标准的SQL,使用起来比其他API更加灵活,因为可以直接使用SQL语句。Table API和SQL可以很容易地结合在一块使用,因为它们都返回Table对象。

        针对这些API我们主要学习下面这些 

 二、DataStream API

DataStream API主要分为3块:DataSource、Transformation、DataSink。

  • DataSource是程序的输入数据源。
  • Transformation是具体的操作,它对一个或多个输入数据源进行计算处理,例如map、flatMap和filter等操作。
  • DataSink是程序的输出,它可以把Transformation处理之后的数据输出到指定的存储介质中。

 (一)DataStream API之DataSoure

        DataSource是程序的输入数据源,Flink提供了大量内置的DataSource,也支持自定义DataSource,不过目前Flink提供的这些已经足够我们正常使用了。
        Flink提供的内置输入数据源:包括基于socket、基于Collection,还有就是Flink还提供了一批Connectors,可以实现读取第三方数据源,

说明:

        (1)Flink 内置:表示Flink中默认自带的。
        (2)Apache Bahir:表示需要添加这个依赖包之后才能使用的。
        (3)针对source的这些Connector,我们在实际工作中最常用的就是Kafka
        (4)当程序出现错误的时候,Flink的容错机制能恢复并继续运行程序,这种错误包括机器故障、网络故障、程序故障等
        (5)针对Flink提供的常用数据源接口,如果程序开启了checkpoint快照机制,Flink可以提供这些容错性保证

1. 使用集合创建DataStream(scala代码)

package com.imooc.scala.stream

import org.apache.flink.streaming.api.scala.{DataStream, StreamExecutionEnvironment}

object StreamCollectionSourceScala {
  def main(args: Array[String]): Unit = {
    val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment

    import org.apache.flink.api.scala._
    //使用collection集合生成DataStream
    val text: DataStream[Int] = env.fromCollection(Array(1, 2, 3, 4, 5))

    text.print().setParallelism(1)

    env.execute("StreamCollectionSourceScala")

  }
}

2. 使用集合创建DataStream (java代码)

package com.imooc.java.stream;

import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

import java.util.Arrays;

public class StreamCollectionSourceJava {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        //使用Collection集合生成DataStream
        DataStreamSource<Integer> text = env.fromCollection(Arrays.asList(1, 2, 3, 4, 5));

        text.print().setParallelism(1);

        env.execute("StreamCollectionSourceJava");
    }
}

(二)、DataStream API之Transformation

transformation是Flink程序的计算算子,负责对数据进行处理,Flink提供了大量的算子,其实Flink中的大部分算子的使用和spark中算子的使用是一样的,下面我们来看一下:

 

 1. union 

  • 表示合并多个流,但是多个流的数据类型必须一致,多个流join之后,就变成了一个流。
  • 应用场景:多种数据源的数据类型一致,数据处理规则也一致

 scala代码:

package com.imooc.scala.stream

import org.apache.flink.streaming.api.scala.{DataStream, StreamExecutionEnvironment}

/**
 * 合并多个流,多个流的数据类型必须一致
 * 应用场景:多种数据源的数据类型一致,数据处理规则也一致
 *
 */
object StreamUnionScala {
  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    import org.apache.flink.api.scala._
    //第一份数据流
    val text1: DataStream[Int] = env.fromCollection(Array(1, 2, 3, 4, 5))
    //第二份数据流
    val text2: DataStream[Int] = env.fromCollection(Array(6, 7, 8, 9, 10))

    //合并流
    val unionStream: DataStream[Int] = text1.union(text2)

    //打印流中的数据
    unionStream.print().setParallelism(1)

    env.execute("StreamUnionScala")

  }
}

Java代码

package com.imooc.java.stream;

import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

import java.util.Arrays;

public class StreamUnionJava {
    public static void main(String[] args) throws Exception{
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        //第一份数据流
        DataStreamSource<Integer> text1 = env.fromCollection(Arrays.asList(1, 2, 3, 4, 5));
        //第二份数据流
        DataStreamSource<Integer> text2 = env.fromCollection(Arrays.asList(6, 7, 8, 9, 10));

        //合并流
        DataStream<Integer> unionStream = text1.union(text2);

        //打印
        unionStream.print().setParallelism(1);

        env.execute("StreamUnionJava");
    }
}

2. connect:只能连接两个流,两个流的数据类型可以不同

        两个流被connect之后,只是被放到了同一个流中,它们内部依然保持各自的数据和形式不发生任何变化,两个流相互独立。

        connect方法会返回connectedStream,在connectedStream中需要使用CoMap、CoFlatMap这种函数,类似于map和flatmap。

Scala代码:

package com.imooc.scala.stream

import org.apache.flink.streaming.api.functions.co.CoMapFunction
import org.apache.flink.streaming.api.scala.{ConnectedStreams, DataStream, StreamExecutionEnvironment}

/**
 * 只能连接两个流,两个流的数据类型可以不同
 * 应用:可以将两种不同格式的数据统一成一种格式
 *
 */
object StreamConnectScala {
  def main(args: Array[String]): Unit = {
    val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment

    import org.apache.flink.api.scala._
    val text1: DataStream[String] = env.fromElements("user:tom,age:18")
    val text2: DataStream[String] = env.fromElements("user:tom_age:18")

    //连接两个流
    val connectStream: ConnectedStreams[String, String] = text1.connect(text2)

    val text: DataStream[String] = connectStream.map(new CoMapFunction[String, String, String] {
      override def map1(in1: String): String = {
        in1.replace(",", "-")
      }

      override def map2(in2: String): String = {
        in2.replace("_", "-")
      }
    })
    //打印
    text.print().setParallelism(1)

    //
    env.execute("StreamConnectScala")

    
  }
}

Java代码:

package com.imooc.java.stream;


import org.apache.flink.streaming.api.datastream.ConnectedStreams;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.co.CoMapFunction;

import java.awt.event.TextEvent;

/**
 * 只能连接两个流,两个流的数据类型可以不同
 * 应用:可以将两种不同格式的数据统一成一种格式
 *
 */
public class StreamConnectJava {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        //第1份数据流
        DataStreamSource<String> text1 = env.fromElements("user:tom,age:18");

        //第2份数据流
        DataStreamSource<String> text2 = env.fromElements("user:tom_age:18");

        //合并两个流
        ConnectedStreams<String, String> connectStream = text1.connect(text2);

        SingleOutputStreamOperator<Object> text = connectStream.map(new CoMapFunction<String, String, Object>() {
            @Override
            public Object map1(String s) throws Exception {
                return s.replace(",", "-");
            }

            @Override
            public Object map2(String s) throws Exception {
                return s.replace("_", "-");
            }
        });

        text.print().setParallelism(1);

        env.execute("StreamConnectJava");

    }
}

3.split:根据规则把一个数据流切分为多个流

注意:

(1)split只能分一次流,切分出来的流不能继续分流

(2)split需要和select配合使用,选择切分后的流

Scala代码:

package com.imooc.scala.stream

import java.{lang, util}

import org.apache.flink.streaming.api.collector.selector.OutputSelector
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment

/**
 * 根据规则把一个数据流切分为多个流
 * 注意:split只能分一次流,切分出来的流不能继续分流
 * split需要和select配合使用,选择切分后的流
 * 应用场景:将一份数据流切分为多份,便于针对每一份数据使用不同的处理逻辑
 */
object StreamSplitScala {
  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    import org.apache.flink.api.scala._
    val text = env.fromCollection(Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))

    //按照数据的奇偶性对数据进行分流
    val splitStream = text.split(new OutputSelector[Int] {
      override def select(value: Int): lang.Iterable[String] = {
        val list = new util.ArrayList[String]()
        if (value % 2 == 0) {
          list.add("even") // 偶数
        } else {
          list.add("odd") //奇数
        }
        list
      }
    })

    //选择流
    val evenStream = splitStream.select("even")
    evenStream.print().setParallelism(1)

    val oddStream = splitStream.select("odd")
    oddStream.print().setParallelism(1)

    env.execute("StreamSplitScala")
  }
}

 Java代码:

package com.imooc.java.stream;

import org.apache.flink.streaming.api.collector.selector.OutputSelector;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SplitStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

import java.util.ArrayList;
import java.util.Arrays;

public class StreamSplitJava {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        DataStreamSource<Integer> text = env.fromCollection(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
        SplitStream<Integer> splitStream = text.split(new OutputSelector<Integer>() {
            @Override
            public Iterable<String> select(Integer value) {
                ArrayList<String> list = new ArrayList<>();
                if (value % 2 == 0) {
                    list.add("even");
                } else {
                    list.add("odd");
                }
                return list;
            }
        });
        DataStream<Integer> evenStream = splitStream.select("even");
        evenStream.print().setParallelism(1);

        DataStream<Integer> oddStream = splitStream.select("odd");
        oddStream.print().setParallelism(1);

        env.execute("StreamSplitJava");
    }
}

目前split切分的流无法进行二次切分,并且split方法已经标记为过时了,官方不推荐使用,现在官方推荐使用side output的方式实现。
下面我来看一下使用side output如何实现流的多次切分

Scala代码:

package com.imooc.scala.stream

import java.{lang, util}

import org.apache.flink.streaming.api.collector.selector.OutputSelector
import org.apache.flink.streaming.api.functions.ProcessFunction
import org.apache.flink.streaming.api.scala.{OutputTag, StreamExecutionEnvironment}
import org.apache.flink.util.Collector

/**
 * 根据规则把一个数据流切分为多个流
 * 注意:split只能分一次流,切分出来的流不能继续分流
 * split需要和select配合使用,选择切分后的流
 * 应用场景:将一份数据流切分为多份,便于针对每一份数据使用不同的处理逻辑
 */
object StreamSplit2Scala {
  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    import org.apache.flink.api.scala._
    val text = env.fromCollection(Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))

    //按照数据的奇偶性对数据进行分流
    //首先定义两个sideoutput来准备保存切分出来的数据
    val outputTag1 = new OutputTag[Int]("even")
    val outputTag2 = new OutputTag[Int]("odd")

    //注意: process属于Flink中的低级api
    val outputStream = text.process(new ProcessFunction[Int, Int] {
      override def processElement(value: Int, context: ProcessFunction[Int, Int]#Context, collector: Collector[Int]): Unit = {
        if (value % 2 == 0) {
          context.output(outputTag1, value)
        } else {
          context.output(outputTag2, value)
        }
      }
    })

    val evenStream = outputStream.getSideOutput(outputTag1)
    val oddStream = outputStream.getSideOutput(outputTag2)
//    evenStream.print().setParallelism(1)
    //对evenStream流进行二次切分
    val outputTag11 = new OutputTag[Int]("low") //保留小于等于5的数字
    val outputTag12 = new OutputTag[Int]("high") //保留大于5的数字

    val subOutputStream = evenStream.process(new ProcessFunction[Int, Int] {
      override def processElement(value: Int, context: ProcessFunction[Int, Int]#Context, collector: Collector[Int]): Unit = {
        if (value <= 5) {
          context.output(outputTag11, value)
        } else {
          context.output(outputTag12, value)
        }
      }
    })
    //获取小于等于5的数据流
    val lowStream = subOutputStream.getSideOutput(outputTag11)
    //获取大于5的数据流
    val highStream = subOutputStream.getSideOutput(outputTag12)

    lowStream.print().setParallelism(1)


    env.execute("StreamSplitScala")
  }
}

4. union和connect的区别

 

 

区别

        (1)union可以连接多个流,最后汇总成一个流,流里面的数据使用相同的计算规则

        (2)connect值可以连接2个流,最后汇总成一个流,但是流里面的两份数据相互还是独立的,每一份数据使用一个计算规则

5. split与side output区别

区别:

        (1)如果是只需要切分一次的话使用split或者side output都可以
        (2)如果想要切分多次,就不能使用split了,需要使用side output

 6. 分区相关的算子

 (三)、DataStream API之DataSink

        DataSink是 输出组件,负责把计算好的数据输出到其它存储介质中
        Flink支持把流数据输出到文件中,不过在实际工作中这种场景不多,因为流数据处理之后一般会存储到一些消息队列里面,或者数据库里面,很少会保存到文件中的。

        还有就是print,直接打印,这个其实我们已经用了很多次了,这种用法主要是在测试的时候使用的,方便查看输出的结果信息

1. Flink提供了一批Connectors,可以实现输出到第三方目的地

2. 针对sink的这些connector,我们在实际工作中最常用的是kafka、redis,针对Flink提供的常用sink组件,可以提供这些容错性保证

3. 需求:接收Socket传输过来的数据,把数据保存到Redis的list队列中。

Scala代码:

package com.imooc.scala.sink

import org.apache.flink.streaming.api.scala.{DataStream, StreamExecutionEnvironment}
import org.apache.flink.streaming.connectors.redis.RedisSink
import org.apache.flink.streaming.connectors.redis.common.config.FlinkJedisPoolConfig
import org.apache.flink.streaming.connectors.redis.common.mapper.{RedisCommand, RedisCommandDescription, RedisMapper}

object StreamRedisSinkScala {
  def main(args: Array[String]): Unit = {
    val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment

    //连接socket获取输入数据
    val text: DataStream[String] = env.socketTextStream("bigdata01", 9001)

    import org.apache.flink.api.scala._
    val listData: DataStream[(String, String)] = text.map(word => ("l_words_scana", word))

    //指定redisSink
    val conf: FlinkJedisPoolConfig = new FlinkJedisPoolConfig.Builder().setHost("bigdata01").setPort(6379).build()
    val redisSink = new RedisSink[Tuple2[String, String]](conf, new MyReidsMapper)
    listData.addSink(redisSink)

    env.execute("StreamRedisSinkScala")

  }

}

class MyReidsMapper extends RedisMapper[Tuple2[String, String]]{
  override def getCommandDescription: RedisCommandDescription = {
    new RedisCommandDescription(RedisCommand.LPUSH)
  }

  override def getKeyFromData(t: (String, String)): String = {
    t._1
  }

  override def getValueFromData(t: (String, String)): String = {
    t._2
  }
}

注意:执行代码之前,需要先开启socket和redis服务

 

 

Flink实时处理之DataStream Flink的API概览 1、dataStream的数据源 1.1、socket数据源socketTextStream 从socket当中接收数据,并统计最近5秒钟每个单词出现的次数 第一步:node01开发socket服务 node01执行以下命令开启socket服务 nc -lk 9000 第二步:开发代码实现 import org.apache.flink.streaming.api.scala.{DataStream, StreamExecutionEnvironment} import org. 阅读详情

相关推荐

Flink详述双流 Join 3 种解决方案 + 2 种优化方案

1.前言 这一期的面试题主要是介绍 Flink 面试中的高频面试题,Flink 流 Join 相关内容,相信大家在面试中遇到的太多了,本节包含的主要内容如下: Join 的应用场景 为什么流式计算中提到 Join 小伙伴萌就怕呢? 带大家看一遍本文思路 Flink Join 解决方案:Flink Window Join Flink Join 解决方案:Flink Interval Join Flink Join 解决方案:Flink Regular Join 上述 3 种解决方...

u011076848的专栏 1万+

Flink的DataStream介绍

1|0一:流式处理基本概念   流处理系统本身有很多自己的特点。一般来说,由于需要支持无限数据集的处理,流处理系统一般采用一种数据驱动的处理方式。它会提前设置一些算子,然后等到数据到达后对数据进行处理。   为了表达复杂的逻辑,flink在内的分布式流处理引擎,一般采用 DAG 图来表示整个计算逻辑,其中 DAG 图中的每一个点就代表一个基本的逻辑单元,也就是前面说的算子,由于计算逻辑被组织成有向图,数据会按照边的方向,从一些特殊的 Source 节点流入系统,然后通过网络传输、本地传输等不同的数据传输

全栈开发的博客 1702

Flink系列-8、Flink DataStream的简介和API开发

Flink系列-8、Flink DataStream的简介和API开发

不积跬步无以至千里,不积小流无以成江河 632

Flink学习——DataStream API

/ 标志位// run方法:不停循环,发送数据// 1. 随机数生成器// 2. 用标志位作为循环判断的条件,不断发送数据// 3. 调用sourceContext的方法向下游发送数据sourceContext.collect(SensorReading("生成:"+i,1,1))// cancel方法:定义标志位,用于run中断的控制读取自定义的数据源Flink 的 DataStream API 编程风格其实是一致的:基本上都是基于 DataStream 调用一个方。

five小点心的博客 2243

Flink【理论篇】04:Flink核心API【Table API和SQL:Table API 和SQL的使用;DataStream、DataSet和Table之间的互相转换】

Flink【理论篇】04:Flink核心API【Table API和SQL:Table API 和SQL的使用;DataStream、DataSet和Table之间的互相转换】

weixin_40612128的博客 1058

Flink常用转换(transformation)算子使用教程(DataSTream API)

一个 Flink 程序,其实就是对 DataStream 的各种转换。获取执行环境(execution environment)读取数据源(source)定义基于数据的转换操作(transformations)定义计算结果的输出位置(sink)触发程序执行(execute)数据源读入数据之后,我们就可以使用各种转换算子,将一个或多个 DataStream 转换为新的 DataStream,如上图所示。一个 Flink 程序的核心,其实就是所有的转换操作,它们决定了处理的业务逻辑。

SunnyRivers 602

Flink基础---04常用的 DataSet 和 DataStream API

现状 在前面的课程中,曾经提到过,Flink 很重要的一个特点是“流批一体”,然而事实上 Flink 并没有完全做到所谓的“流批一体”,即编写一套代码,可以同时支持流式计算场景和批量计算的场景。目前截止 1.10 版本依然采用了 DataSet 和 DataStream 两套 API 来适配不同的应用场景。 DateSet 和 DataStream 的区别和联系 在官网或者其他网站上,都可以找到目前 Flink 支持两套 API 和一些应用场景,但大都缺少了“为什么”这样的思考。 Apache Flink

weixin_42642502的博客 1074

DataStream执行环境

DataStream(数据流)本身是 Flink 中一个用来表示数据集合的类(Class),我们编写的Flink 代码其实就是基于这种数据类型的处理,所以这套核心 API 就以 DataStream 命名。对于批处理和流处理,我们都可以用这同一套 API 来实现。DataStream 在用法上有些类似于常规的 Java 集合,但又有所不同。我们在代码中往往并不关心集合中具体的数据,而只是用 API 定义出一连串的操作来处理它们;这就叫作数据流的“转换”(transformations)。

SunnyRivers 338

轻松通关Flink第04讲:Flink 常用的 DataSet 和 DataStream API

本课时我们主要介绍 Flink 的 DataSet 和 DataStream 的 API,并模拟了实时计算的场景,详细讲解了 DataStream 常用的 API 的使用。

sucaiwa的博客 685

大数据工程师必备:Flink核心技术与实战项目完整源码笔记

在流处理中,“时间”并非单一概念,而是根据上下文存在多种解释:事件时间(Event Time):指事件在其源头设备上产生的实际时间戳,例如用户点击按钮的时间、传感器记录温度的时刻等。这是最符合业务含义的时间维度。摄入时间(Ingestion Time):指事件进入Flink源算子(Source Operator)时系统赋予的时间戳,由运行中的TaskManager自动生成。处理时间(Processing Time):指事件在某个算子中被处理时的本地系统时间。时间类型。

weixin_42388898的博客 1156

概率论 知识图谱 + 实战案例解析

本文通过构建概率论知识图谱,系统梳理了从随机试验、概率、条件概率到随机变量与分布的核心概念及其内在联系。结合朴素贝叶斯分类器和蒙特卡洛模拟等实战案例,深入解析了条件概率、独立性及大数定律等理论如何应用于机器学习与实际问题求解,旨在帮助读者建立结构化思维,将理论有效转化为解决实际问题的能力。

weixin_29051193的博客 267

04_Flink Streaming DataStream

DataStream对象,简称ds,作为流计算编程的核心上下文。提供多种功能 //1:接入数据源 1:ds由env和SourceFunction产生,完成接入数据源的功能 //2:数据处理 2:filter。实现过滤功能 3:map,实现1->1的映射转换 4:flatmap,实现拆解字符串等复杂的转换功能 5:project,实现字段裁剪 6:transform实现复杂需求的功能

codemosi的专栏,点击我可以跳到目录一栏 2967

Unity中5自由度机械臂运动控制与夹爪交互仿真实践

本文详细介绍了在Unity中实现5自由度机械臂运动控制与夹爪交互仿真的完整流程。从模型导入、物理组件配置到关节运动控制算法(包括逆运动学IK),再到夹爪抓取逻辑和工业分拣案例实战,提供了可落地的代码示例与性能优化方案,助力开发者快速掌握机械臂仿真核心技术。

weixin_29021757的博客 446

Flink教程(04)- Flink入门案例

文章目录01 引言02 开发前准备2.1 API2.2 编程模型03 入门案例3.1 项目搭建3.2 代码实现3.2.1 基于DataSet3.2.2 基于DataStream3.2.3 Lambda版3.2.3 在Yarn上运行04 Flink原理 01 引言 在前面的博客,我们已经可以基本把Flink的环境搭建起来了,有兴趣的同学可以参阅下: 《Flink教程(01)- Flink知识图谱》 《Flink教程(02)- Flink入门》 《Flink教程(03)- Flink环境搭建》 Flink

阿甘兄 3551

win11本地部署 DeepSeek-R1 大模型!免费开源,媲美OpenAI-o1能力,断网也能用

是否安装成功,然后直接运行部署deepseek-r1的命令。,出现下面界面即为安装成功。在cmd窗口中先输入。

记录学习编程的日常 2992

手把手教你用6轴IMU跑通LIO-SAM:参数配置与代码修改保姆级教程

本文提供了一套完整的6轴IMU适配LIO-SAM的解决方案,包括参数配置与代码修改的详细步骤。从理解6轴与9轴IMU的关键差异入手,逐步指导如何调整核心配置文件params.yaml、重构utility.h关键函数、优化mapOptimization.cpp的位姿融合逻辑,并给出编译验证与性能调优建议,帮助开发者快速实现6轴IMU在LIO-SAM中的稳定运行。

weixin_28717807的博客 357

FLink学习笔记:04-Flink DataStream的TransForm操作

文章目录mapflatMapfilterkeyBy与滚动聚合算子keyBy与reduce分流 split和Select合流UnionConnectCoMapCoFlatMap map 说明: 一个输入对应一个输出 示例代码: package com.hjt.yxh.apitest import org.apache.flink.api.common.functions.{FilterFunction, FlatMapFunction, MapFunction, ReduceFunction} import

434

海思芯片OpenHarmony系统移植:Sensor传感器模块HDF驱动配置HCS文件详解

海思系列芯片的传感器模块通过HDF(Hardware Driver Foundation)驱动框架进行管理和配置。传感器HCS(HDF Configuration Source)配置文件定义了各类传感器的硬件参数、总线配置、寄存器序列等信息,为传感器驱动提供必要的初始化和运行参数。海思系列芯片适配OpenHarmony的传感器HDF配置HCS文件是传感器驱动开发的关键部分,通过合理配置可以实现各种传感器设备的驱动支持。

m0_67505153的博客 209

Flink教程(16)- Flink Table与SQL

文章目录01 引言02 Table API & SQL 介绍2.1 Flink Table模块 2.2 Table API & SQL特点 2.3 Table API& SQL发展历程 03 开发准备3.1 添加依赖3.2 程序结构3.3 API3.3.1 获取环境3.3.3 创建表3.3.4 查询表3.3.5 写出表3.3.6 与DataSet/DataStream集成3.3.6.1 从DataStream和DataSet创建视图3.3.6.2 转换DataStream和DataS

阿甘兄 6608

LVGL core group焦点分组管理(lv_group.c)

lv_group_t是用于焦点管理的,将需要获取焦点的对像加入到同一个分组内,再将其通过挂到指定的事件驱动中,就可以控制焦点了。而被加入的对象又可以通过焦点状态事件和事件来控制对象的焦点逻辑了。创建好的分组通过接口挂事件驱动中,这样就可以指定一个自定义的焦点分组了。;) {if(!} }友情提示:无论是接口还是都是单例的,即被设置后前一个被设置的值就失效了;此方案可以保证焦点的唯一 性,但也一定要记住要在适合的位置设置回来,以防丢失焦点。

Bigan(安)的博客 3909

Open Dynamics Engine(ODE)物理引擎教程(1)--下载与安装准备

引言 ODE是一个免费的工业级库,用于模拟关节式刚体动力学,例如地面车辆、腿部生物和虚拟现实环境中的移动对象。它具有快速、灵活、健壮和独立于平台的特点,具有先进的关节、摩擦接触和内置的碰撞检测功能。 项目主页:http://www.ode.org/ 线上手册:http://ode.org/wiki/index.php?title=Manual 本教程为博主亲自亲测过程的总结,转载请注明出处! ...

腿足机器人领域 2216

Flink Table API & SQL 时间属性(Time Attributes)完全指南:处理时间、事件时间与 Watermark 进阶配置

时间属性(Time Attribute)是 Flink Table API & SQL 中所有基于时间操作的基石——无论是窗口聚合、Interval Join、Temporal Join 还是 CEP,都需要表提供可被系统识别的逻辑时间。本文以当前仓库的官方中文文档为主体,结合源码实现,系统讲解如何在 `CREATE TABLE` DDL、`DataStream` 到 Table 转换以及自定义

gitblog_00445的博客 345

笔试题-2023-芯原-数字前端设计or验证【纯净题目版】

笔试题-2023-芯原-数字前端设计or验证【纯净题目版】

w0shishabi的博客 5685

Flink教程(17)- Flink Table与SQL(案例与SQL算子)

文章目录01 引言02 Flink Table&SQL 案例2.1 案例1(DataStream SQL统计)2.2 案例2(DataStream Table&SQL统计)2.3 案例3(SQL与滚动窗口)2.4 案例4(SQL消费Kafka)03 Flink SQL常用算子3.1 SELECT3.2 WHERE3.3 DISTINCT3.4 GROUP BY3.5 UNION 和 UNION ALL3.6 JOIN3.7 Group Window3.7.1 Tumble Wi

阿甘兄 2749

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

零基础学会flink,保姆级超详细教学

本文提供了一个三周学会Apache Flink的详细学习路线,从环境搭建到项目实战,适合零基础开发者快速掌握Flink流处理技术。 学习路线概览: 环境搭建(JDK11、Maven、IntelliJ IDEA和Flink集群) 基础入门(WordCount程序) 核心API学习(DataStream算子、时间窗口、状态管理) 高级功能(Table API/SQL、Kafka连接器) 综合项目实战(实时订单统计/用户行为分析) 第一天重点: 详细演示了开发环境配置(JDK11安装验证、Maven配置、IDEA

korry24的博客 289

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

7.Flink数据流API编程指南-上

Flink数据流API编程指南

流月up的博客 1368

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: Redis02: Redis基础命令
下一篇: Flink04: Flink核心API之DataSet
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值