Flink第八章:FlinkSQL

news2024/12/28 19:10:57

系列文章目录

Flink第一章:环境搭建
Flink第二章:基本操作.
Flink第三章:基本操作(二)
Flink第四章:水位线和窗口
Flink第五章:处理函数
Flink第六章:多流操作
Flink第七章:状态编程
Flink第八章:FlinkSQL


文章目录

  • 系列文章目录
  • 前言
  • 一、常用函数
    • 1.快速上手案例
    • 2.连接外部数据(csv)
    • 3.时间窗口案例
    • 4.TopN案例1
    • 5.TopN案例2
  • 二、UDF函数
    • 1.Scalar Function(标量函数)
    • 2.Table Function(表函数)
    • 3.Aggregate Function(聚合函数).
    • 4.Table Aggregate Function(表聚合函数 不建议)
  • 总结


前言

这次博客我们记录以下FlinkSQL的学习内容
在这里插入图片描述


一、常用函数

1.快速上手案例

SimpleTableExample.scala

package com.atguigu.chapter07

import com.atguigu.chapter02.Source.Event
import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.Expressions.$
import org.apache.flink.table.api.Table
import org.apache.flink.table.api.bridge.scala.StreamTableEnvironment

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

    // 读取数据源
    val eventStream: DataStream[Event] = env.fromElements(
      Event("Alice", "./home", 1000L),
      Event("Bob", "./cart", 1000L),
      Event("Alice", "./prod?id=1", 5 * 1000L),
      Event("Cary", "./home", 60 * 1000L),
      Event("Bob", "./prod?id=3", 90 * 1000L),
      Event("Alice", "./prod?id=7", 105 * 1000L)
    )

    // 创建表环境
    val tableEnv: StreamTableEnvironment = StreamTableEnvironment.create(env)

    // 将DataStream装换成表
    val eventTable: Table = tableEnv.fromDataStream(eventStream)

    // 调用Table API 进行转换计算(不建议)
    val resultTable: Table = eventTable.select($("user"), $("url"))
      .where($("user").isEqual("Alice"))
    // 直接写SQL

    tableEnv.createTemporaryView("eventTable",eventTable)
    val resultSQLTable: Table = tableEnv.sqlQuery("select url,user from eventTable where user='Bob'")

    // 装换成流打印
    tableEnv.toDataStream(resultTable).print("1")
    tableEnv.toDataStream(resultSQLTable).print("2")

    env.execute()

  }
}

在这里插入图片描述

2.连接外部数据(csv)

CommonApiTest.scala

package com.atguigu.chapter07

import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.{EnvironmentSettings, Table, TableEnvironment}
import org.apache.flink.table.api.bridge.scala.StreamTableEnvironment

object CommonApiTest {
  def main(args: Array[String]): Unit = {
    // 1创建表环境(2种方法)
    // 1.1直接基于流创建
    val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
    env.setParallelism(1)

    val tableEnv: StreamTableEnvironment = StreamTableEnvironment.create(env)

    // 1.2传入一个环境的配置参数创建
    val settings: EnvironmentSettings = EnvironmentSettings
      .newInstance()
      .inStreamingMode()
      .build()
    val tableEnvironment: TableEnvironment = TableEnvironment.create(settings)

    // 2.创建输入表
    tableEnv.executeSql(
      """
        | CREATE TABLE eventTable(
        |   uid STRING,
        |   url STRING,
        |   ts BIGINT
        | ) WITH(
        | 'connector' = 'filesystem',
        | 'path' = 'input/clicks.txt',
        | 'format' = 'csv'
        | )
        |""".stripMargin)


    // 3.表的查询转换
    val resultTable: Table = tableEnv.sqlQuery("select uid,url,ts from eventTable where uid= 'Alice' ")

    val urlCountTable: Table = tableEnv.sqlQuery("select uid,count(url) from eventTable group by uid")

    // 4.创建输出表
    tableEnv.executeSql(
      """
        |CREATE TABLE outTable(
        |  uid STRING,
        |  url STRING,
        |  ts BIGINT
        |) WITH(
        | 'connector' = 'filesystem',
        | 'path'='output',
        | 'format'='csv'
        |)
        |""".stripMargin)


    // 5.输出结果
    resultTable.executeInsert("outTable")

    tableEnv.toDataStream(resultTable).print("resultTable")
    tableEnv.toChangelogStream(urlCountTable).print("count")
    env.execute()
  }

}

csv文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里特别说明一下,我在创建输入表时出现了错误,代码没有报错,但是编译没有通过,最终从excel 导出一个csv文件传入,完成运行,之后在替换成符合格式要求的txt文件即可正常运行.(具体啥原因,我也不知道)

3.时间窗口案例

TimeAndWindowTest.scala

package com.atguigu.chapter07


import com.atguigu.chapter02.Source.Event
import org.apache.flink.api.common.eventtime.{SerializableTimestampAssigner, WatermarkStrategy}
import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.Expressions.$
import org.apache.flink.table.api.{DataTypes, Schema, Table}
import org.apache.flink.table.api.bridge.scala.StreamTableEnvironment

import java.time.Duration

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

    val tableEnv: StreamTableEnvironment = StreamTableEnvironment.create(env)

    // 1.在创建表的DDL中指定时间属性字段
    tableEnv.executeSql(
      """
        | CREATE TABLE eventTable(
        |   uid STRING,
        |   url STRING,
        |   ts BIGINT,
        |   et AS TO_TIMESTAMP( FROM_UNIXTIME(ts/1000)),
        |   WATERMARK FOR et AS et - INTERVAL '2' SECOND
        | ) WITH(
        |   'connector' = 'filesystem',
        |   'path' = 'input/clicks.txt',
        |   'format' = 'csv'
        | )
        |""".stripMargin)

    // 2. 在将流转换成表的时候指定时间属性字段

    val eventStream: DataStream[Event] = env.fromElements(
      Event("Alice", "./home", 1000L),
      Event("Bob", "./cart", 1000L),
      Event("Alice", "./prod?id=1", 25 * 60 * 1000L),
      Event("Alice", "./prod?id=4", 55 * 60 * 1000L),
      Event("Bob", "./prod?id=5", 3600 * 1000L + 60 * 1000L),
      Event("Cary", "./home", 3600 * 1000L + 30 * 60 * 1000L),
      Event("Cary", "./prod?id=7", 3600 * 1000L + 59 * 60 * 1000L)
    ).assignTimestampsAndWatermarks(WatermarkStrategy.forBoundedOutOfOrderness(Duration.ofSeconds(2))
      .withTimestampAssigner(new SerializableTimestampAssigner[Event] {
        override def extractTimestamp(t: Event, l: Long): Long = t.timestamp
      }))

    // 已经弃用
//        val eventTable: Table = tableEnv.fromDataStream(eventStream,$("url"),$("user").as("uid"),
//          $("timestamp").as("ts"),$("et").rowtime())

    // 修改后
    val eventTable: Table = tableEnv.fromDataStream(eventStream, Schema.newBuilder()
      .columnByExpression("et", "TO_TIMESTAMP(FROM_UNIXTIME(`timestamp`/1000))")
      .watermark("et", "SOURCE_WATERMARK()").build()).as("uid", "url","ts")


    eventTable.printSchema()

    tableEnv.createTemporaryView("eventTable", eventTable)

    // 测试累积窗口
    val resultTable: Table = tableEnv.sqlQuery(
      """
        |select
        |   uid, window_end AS endT ,COUNT(url) AS cnt
        |FROM TABLE(
        | CUMULATE(
        |   TABLE eventTable,
        |   DESCRIPTOR(et),
        |   INTERVAL '30' MINUTE,
        |   INTERVAL '1' HOUR
        | )
        |)
        |GROUP BY uid,window_start,window_end
        |""".stripMargin)

//    tableEnv.toDataStream(resultTable).print()


    // 测试开窗集合
    val overResultTable: Table = tableEnv.sqlQuery(
      """
        |SELECT uid,url,ts,AVG(ts) OVER (
        |  PARTITION BY uid
        |  ORDER BY et
        |  ROWS BETWEEN 3 PRECEDING AND CURRENT ROW
        |) AS vag_ts
        |FROM eventTable
        |""".stripMargin)

    tableEnv.toChangelogStream(overResultTable).print("over")


    env.execute()
  }
}

在这里插入图片描述

4.TopN案例1

TopNExample.scala

package com.atguigu.chapter07

import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.Table
import org.apache.flink.table.api.bridge.scala.{StreamTableEnvironment, tableConversions}

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

    val tableEnv: StreamTableEnvironment = StreamTableEnvironment.create(env)


    // 2.创建输入表
    tableEnv.executeSql(
      """
        | CREATE TABLE eventTable(
        |   uid STRING,
        |   url STRING,
        |   ts BIGINT,
        |   et AS TO_TIMESTAMP( FROM_UNIXTIME(ts/1000)),
        |   WATERMARK FOR et AS et - INTERVAL '2' SECOND
        | ) WITH(
        | 'connector' = 'filesystem',
        | 'path' = 'input/clicks.txt',
        | 'format' = 'csv'
        | )
        |""".stripMargin)

    // TOP N 选取活跃度最大的两个用户
    // 1.进行分组聚合统计,计算每个用户访问量
    val urlCountTable: Table = tableEnv.sqlQuery("select uid,count(url) as cnt from eventTable group by uid")
    tableEnv.createTemporaryView("urlCountTable",urlCountTable)

    // 2.提取最大的两个用户
    val top2resultTable: Table = tableEnv.sqlQuery(
      """
        |SELECT uid,cnt,row_num
        |FROM (
        |   SELECT * ,ROW_NUMBER() OVER (
        |     ORDER BY cnt DESC
        |   )AS row_num
        |   FROM urlCountTable
        |)
        |WHERE row_num<=2
        |""".stripMargin)

    tableEnv.toChangelogStream(top2resultTable).print()

    env.execute()
  }

}

在这里插入图片描述

5.TopN案例2

TopNWindowExample.scala

package com.atguigu.chapter07

import com.atguigu.chapter02.Source.Event
import org.apache.flink.api.common.eventtime.{SerializableTimestampAssigner, WatermarkStrategy}
import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.{Schema, Table}
import org.apache.flink.table.api.bridge.scala.StreamTableEnvironment

import java.time.Duration

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

    val tableEnv: StreamTableEnvironment = StreamTableEnvironment.create(env)


    // 2.创建输入表
    val eventStream: DataStream[Event] = env.fromElements(
      Event("Alice", "./home", 1000L),
      Event("Bob", "./cart", 1000L),
      Event("Alice", "./prod?id=1", 25 * 60 * 1000L),
      Event("Alice", "./prod?id=4", 55 * 60 * 1000L),
      Event("Bob", "./prod?id=5", 3600 * 1000L + 60 * 1000L),
      Event("Cary", "./home", 3600 * 1000L + 30 * 60 * 1000L),
      Event("Cary", "./prod?id=7", 3600 * 1000L + 59 * 60 * 1000L)
    ).assignTimestampsAndWatermarks(WatermarkStrategy.forBoundedOutOfOrderness(Duration.ofSeconds(2))
      .withTimestampAssigner(new SerializableTimestampAssigner[Event] {
        override def extractTimestamp(t: Event, l: Long): Long = t.timestamp
      }))

    val eventTable: Table = tableEnv.fromDataStream(eventStream, Schema.newBuilder()
      .columnByExpression("et", "TO_TIMESTAMP(FROM_UNIXTIME(`timestamp`/1000))")
      .watermark("et", "SOURCE_WATERMARK()").build()).as("uid", "url")

    tableEnv.createTemporaryView("eventTable",eventTable)


    // TOP N 选取每小时内活跃度最大的两个用户
    // 1.进行窗口聚合统计,计算每个用户访问量
    val urlCountWindowTable: Table = tableEnv.sqlQuery(
      """
        |SELECT uid ,COUNT(url) AS cnt,window_start,window_end
        |FROM TABLE(
        |   TUMBLE(TABLE eventTable,DESCRIPTOR(et),INTERVAL '1' HOUR)
        |)
        |GROUP BY uid,window_start,window_end
        |""".stripMargin)

    tableEnv.createTemporaryView("urlCountWindowTable",urlCountWindowTable)

    // 2.提取最大的两个用户
    val top2resultTable: Table = tableEnv.sqlQuery(
      """
        |SELECT *
        |FROM (
        |   SELECT * ,ROW_NUMBER() OVER (
        |     PARTITION BY window_start,window_end
        |     ORDER BY cnt DESC
        |   )AS row_num
        |   FROM urlCountWindowTable
        |)
        |WHERE row_num<=2
        |""".stripMargin)

    tableEnv.toDataStream(top2resultTable).print()

    env.execute()

  }
}

在这里插入图片描述

二、UDF函数

1.Scalar Function(标量函数)

UdfTest_ScalaFunction.scala

package com.atguigu.chapter07

import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.Table
import org.apache.flink.table.api.bridge.scala.StreamTableEnvironment
import org.apache.flink.table.functions.ScalarFunction

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

    val tableEnv: StreamTableEnvironment = StreamTableEnvironment.create(env)


    // 2.创建输入表
    tableEnv.executeSql(
      """
        | CREATE TABLE eventTable(
        |   uid STRING,
        |   url STRING,
        |   ts BIGINT,
        |   et AS TO_TIMESTAMP( FROM_UNIXTIME(ts/1000)),
        |   WATERMARK FOR et AS et - INTERVAL '2' SECOND
        | ) WITH(
        | 'connector' = 'filesystem',
        | 'path' = 'input/clicks.txt',
        | 'format' = 'csv'
        | )
        |""".stripMargin)

    // 2.注册标量函数
    tableEnv.createTemporarySystemFunction("myHash",classOf[MyHash])

    // 3.调用函数
    val resultTable: Table = tableEnv.sqlQuery("select uid,myHash(uid) from eventTable")

    // 4.打印输出
    tableEnv.toDataStream(resultTable).print()

    env.execute()


  }
  // 实现自定义标量函数 哈希函数
  class MyHash extends ScalarFunction {
    def eval(str:String): Int ={
      str.hashCode
    }
  }

}

在这里插入图片描述

2.Table Function(表函数)

UdfTest_TableFunction.scala

package com.atguigu.chapter07

import com.atguigu.chapter07.UdfTest_ScalaFunction.MyHash
import org.apache.flink.api.common.typeutils.TypeSerializer
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.table.annotation.{DataTypeHint, ExtractionVersion, FunctionHint, HintFlag, InputGroup}
import org.apache.flink.table.api.Table
import org.apache.flink.table.api.bridge.scala.StreamTableEnvironment
import org.apache.flink.table.functions.TableFunction
import org.apache.flink.types.Row

import java.lang.annotation.Annotation

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

    val tableEnv: StreamTableEnvironment = StreamTableEnvironment.create(env)


    // 1.创建输入表
    tableEnv.executeSql(
      """
        | CREATE TABLE eventTable(
        |   uid STRING,
        |   url STRING,
        |   ts BIGINT,
        |   et AS TO_TIMESTAMP( FROM_UNIXTIME(ts/1000)),
        |   WATERMARK FOR et AS et - INTERVAL '2' SECOND
        | ) WITH(
        | 'connector' = 'filesystem',
        | 'path' = 'input/clicks.txt',
        | 'format' = 'csv'
        | )
        |""".stripMargin)

    // 2.注册表函数
    tableEnv.createTemporarySystemFunction("MySplit", classOf[MySplit])

    // 3.调用函数
    val resultTable: Table = tableEnv.sqlQuery(
      """
        |select
        |   uid,url,word,len
        |from eventTable,lateral table(mySplit(url)) as T(word,len)
        |""".stripMargin)

    // 4.打印输出
    tableEnv.toDataStream(resultTable).print()

    env.execute()

  }

  // 实现自定义表函数 按照?分割url字段
  @FunctionHint(output = new DataTypeHint("ROW<word STRING,length INT>"))
  class MySplit extends TableFunction[Row] {
    def eval(str: String): Unit = {
      str.split("\\?").foreach(s => collect(Row.of(s, Int.box(s.length))))
    }
  }

}

在这里插入图片描述

3.Aggregate Function(聚合函数).

UdfTest_AggregateFunction.scala

package com.atguigu.chapter07

import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.table.api.Table
import org.apache.flink.table.api.bridge.scala.StreamTableEnvironment
import org.apache.flink.table.functions.AggregateFunction

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

    val tableEnv: StreamTableEnvironment = StreamTableEnvironment.create(env)


    // 1.创建输入表
    tableEnv.executeSql(
      """
        | CREATE TABLE eventTable(
        |   uid STRING,
        |   url STRING,
        |   ts BIGINT,
        |   et AS TO_TIMESTAMP( FROM_UNIXTIME(ts/1000)),
        |   WATERMARK FOR et AS et - INTERVAL '2' SECOND
        | ) WITH(
        | 'connector' = 'filesystem',
        | 'path' = 'input/clicks.txt',
        | 'format' = 'csv'
        | )
        |""".stripMargin)

    // 2.注册表函数
    tableEnv.createTemporarySystemFunction("WeightedAvg", classOf[WeightedAvg])

    // 3.调用函数
    val resultTable: Table = tableEnv.sqlQuery(
      """
        |select
        |   uid,WeightedAvg(ts,1) as avg_ts
        |from eventTable
        |group by uid
        |""".stripMargin)

    // 4.打印输出
    tableEnv.toChangelogStream(resultTable).print()

    env.execute()

  }

  // 单独定义样例类
  case class WeightedAccumulator(var sum: Long = 0, var count: Int = 0)

  // 实现自定义聚合函数 计算加强平均数
  class WeightedAvg extends AggregateFunction[java.lang.Long, WeightedAccumulator] {
    override def getValue(accumulator: WeightedAccumulator): java.lang.Long = {
      if (accumulator.count == 0) {
        null
      } else {
        accumulator.sum / accumulator.count
      }
    }

    override def createAccumulator(): WeightedAccumulator = WeightedAccumulator() // 创建累加器

    // 每来一行数据,都会调用
    def accumulate(accumulator: WeightedAccumulator, iValue: java.lang.Long, iWeight: Int): Unit = {
      accumulator.sum += iValue
      accumulator.count += iWeight
    }
  }
}

在这里插入图片描述

4.Table Aggregate Function(表聚合函数 不建议)

package com.atguigu.chapter07

import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.table.api.Expressions.{$, call}
import org.apache.flink.table.api.Table
import org.apache.flink.table.api.bridge.scala.StreamTableEnvironment
import org.apache.flink.table.functions.TableAggregateFunction
import org.apache.flink.util.Collector

import java.sql.Timestamp


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

    val tableEnv: StreamTableEnvironment = StreamTableEnvironment.create(env)


    // 1.创建输入表
    tableEnv.executeSql(
      """
        | CREATE TABLE eventTable(
        |   uid STRING,
        |   url STRING,
        |   ts BIGINT,
        |   et AS TO_TIMESTAMP( FROM_UNIXTIME(ts/1000)),
        |   WATERMARK FOR et AS et - INTERVAL '2' SECOND
        | ) WITH(
        | 'connector' = 'filesystem',
        | 'path' = 'input/clicks.txt',
        | 'format' = 'csv'
        | )
        |""".stripMargin)

    // 2.注册表聚合函数
    tableEnv.createTemporarySystemFunction("top2", classOf[Top2])

    // 3.调用函数
    // 首先进行窗口聚合得到cnt
    val urlCountWindowTable: Table = tableEnv.sqlQuery(
      """
        |SELECT uid ,COUNT(url) AS cnt,window_start as wstart ,window_end as wend
        |FROM TABLE(
        |   TUMBLE(TABLE eventTable,DESCRIPTOR(et),INTERVAL '1' HOUR)
        |)
        |GROUP BY uid,window_start,window_end
        |""".stripMargin)

    // 使用Table API调用表聚合函数
    val resultTable: Table = urlCountWindowTable.groupBy($("wend"))
      .flatAggregate(call("top2", $("uid"), $("cnt"), $("wstart"), $("wend")))
      .select($("uid"), $("rank"), $("cnt"), $("wend"))



    // 4.打印输出
    tableEnv.toChangelogStream(resultTable).print()

    env.execute()

  }

  // 定义输出结果和中间累加器的样例类
  case class Top2Result(uid: String, window_start: Timestamp, window_end: Timestamp, cnt: Long, rank: Int)

  case class Top2Acc(var maxCount: Long, var secondMaxCount: Long, var uid1: String, var uid2: String, var window_start: Timestamp, var window_end: Timestamp)

  // 实现表聚合自定义函数
  class Top2 extends TableAggregateFunction[Top2Result, Top2Acc] {
    override def createAccumulator(): Top2Acc = Top2Acc(Long.MinValue, Long.MinValue, null, null, null, null)

    // 每来一行数据,需要使用acc进行统计
    def accumulate(acc: Top2Acc, uid: String, cnt: Long, window_start: Timestamp, window_end: Timestamp): Unit = {
      acc.window_start = window_start
      acc.window_end = window_end
      // 判断当前count值是否排名前两位
      if (cnt > acc.maxCount) {
        // 名次向后顺延
        acc.secondMaxCount = acc.maxCount
        acc.uid2 = acc.uid1
        acc.maxCount = cnt
        acc.uid1 = uid
      } else if (cnt > acc.secondMaxCount) {
        acc.secondMaxCount = cnt
        acc.uid2 = uid
      }
    }

    // 输出结果数据
    def emitValue(acc: Top2Acc, out: Collector[Top2Result]): Unit = {
      // 判断cnt值是否为初始值
      if (acc.maxCount != Long.MinValue) {
        out.collect(Top2Result(acc.uid1, acc.window_start, acc.window_end, acc.maxCount, 1))
      }
      if (acc.secondMaxCount!=Long.MinValue){
        out.collect(Top2Result(acc.uid2,acc.window_start,acc.window_end,acc.secondMaxCount,2))
      }
    }
  }
}

在这里插入图片描述


总结

FlinkSQL的内容就记录到这里.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/600986.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python岗位需求日渐增加

Python岗位需求日渐增加 Python编程语言在当前的IT行业中越来越受欢迎。其灵活性和易用性使得Python在各种领域中使用广泛&#xff0c;比如Web开发、数据科学、人工智能等。作为一名有10年Python编程经验的工程师&#xff0c;我认为Python是一种非常有前途的编程语言&#xff…

IDC MarketScape《决策支持分析数据平台供应商评估》报告发布,亚马逊云科技位列“领导者”

随着科学技术的不断发展&#xff0c;人们的生活方式也在不断改变。现在&#xff0c;人们可以通过互联网获得更多的信息&#xff0c;也可以通过智能手机随时随地与他人进行交流。此外&#xff0c;人工智能技术的进步也使得机器能够完成一些复杂的任务&#xff0c;从而提高了人们…

重磅新品 | 立仪发布高速版嵌入式光谱共焦G系列

重磅新品 | 立仪发布高速版嵌入式光谱共焦G系列 立仪科技作为国产光谱共焦技术的引领者&#xff0c;在光谱共焦技术上数年磨一剑&#xff0c;打破封锁&#xff0c;而此次研发出的嵌入式光谱共焦位移传感器G系列采用先进的FPGACPU硬件架构等技术自研而成并结合高强度LED光源、创…

python---变量和简单的数据类型

python---变量和简单的数据类型 1. 变量的命名2. 字符串2.1 使用方法修改字符串的大小写2.2 合并&#xff08;拼接&#xff09;字符串2.3 使用制表符或换行符来添加空白2.4 删除空白2.5 使用字符串时避免使用语法错误 3. 数字3.1 整数3.2 浮点数3.3 使用函数str()避免类型错误 …

基于springboot地方旅游系统的设计与实现

摘 要 本次设计内容是基于Springboot的旅游系统的设计与实现&#xff0c;采用B/S三层架构分别是Web表现层、Service业务层、Dao数据访问层&#xff0c;并使用Springboot&#xff0c;MyBatis二大框架整合开发服务器端&#xff0c;前端使用vue&#xff0c;elementUI技术&…

vue-admin-template刷新侧边栏数据丢失

使用vue-admin-template时&#xff0c;刷新页面侧边栏消失&#x1f612;&#xff0c;仔细查看代码后找到原因&#xff0c;使用的路由与vuex有关&#xff0c;而在刷新页面时vue会重新加载vue实例&#xff0c;vuex中的数据会被初始化&#xff0c;所以看不到侧边栏是因为数据被重置…

虚拟现实 VR 智慧办公室可视化

“虚拟现实”是来自英文“Virtual Reality”&#xff0c;简称 VR 技术&#xff0c;其是通过利用计算机仿真系统模拟外界环境&#xff0c;主要模拟对象有环境、技能、传感设备和感知等&#xff0c;为用户提供多信息、三维动态、交互式的仿真体验。 图扑软件基于自研可视化引擎 H…

containerd 容器概述

containerd 容器概述 官方文档: https://containerd.io在 2016 年 12 月 14 日&#xff0c;Docker 公司宣布将 containerd 从 Docker 中分离&#xff0c;由开源社区独立发展和 运营。Containerd 完全可以单独运行并管理容器&#xff0c;而 Containerd 的主要职责是镜像管理和…

K8S-解决报错--总结日记

问题一&#xff1a;etcd和apiserver无法正常启动 问题查看nodes节点发生报错 解决方法/步骤 步骤一&#xff1a;K8S集群节点异常重启后&#xff0c;再终端执行kubectl get nodes命令&#xff0c;出现报错dial tcp 10.200.18.100:6443: connect: connection refused。 步骤二…

elementPlus 二次封装 el-upload

此案例是区分上传的文件还是图片&#xff1b; 需要注意的是 before-upload 事件&#xff0c;如果是返回了 false&#xff0c;也会默认走on-remove&#xff0c;需要在 remove事件里做file 的状态判断。 <template><el-upload class"upload-box" ref"…

python3a 之 循环与加速(for循环,list 简化,iterrows, enumerate )

1. map 的用法&#xff1a; 替代for循环&#xff0c;辅助加速 map(function, list) 简写 map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函数 [1, 4, 9, 16, 25] 提供了两个列表&#xff0c;对相同位置的列表数据进行相加 >>> map(lambda x, y: x y, …

做电商数据分析报表做到废?BI平台试过了?

层出不穷的临时分析需求、大量的重复性操作、眨眼流失的时间&#xff0c;那是电商数据分析人员才都懂的感受。每日一问&#xff0c;今天你做电商数据分析报表做到废了吗&#xff1f;怎么改变这种情况&#xff1f;或许BI大数据分析平台可以一试。 BI大数据分析平台&#xff1a;…

activiti和flowable如何迁移到camunda

一、activiti如何迁移到camunda 将 流程引擎Activiti 迁移到工作流平台Camunda 需要考虑以下几个方面&#xff1a; 1、流程定义的兼容性&#xff1a;Camunda 支持 BPMN 2.0 规范&#xff0c;因此 Activiti 定义的流程需要进行检查和调整以确保与 Camunda 兼容。 2、数据库兼容…

什么是ChatGPT,原理是什么?看完这篇还不懂,我直播吃屏!!福利:中文版CHAT GPT镜像纯分享

目录 福利&#xff1a;文末纯分享中文版CHAT GPT镜像&#xff0c;不存在魔法&#xff0c;纯分享免费使用 前言&#xff1a; 1. 概率从何而来&#xff1f; 2、什么是模型 3、类人的任务模型 3、神经网络 4 、机器学习和神经网络的训练 5、神经网络训练的实践与理论 6、嵌…

BGA和QFP有什么区别?引脚设计有哪些方法?

CPU是中央处理器&#xff0c;Central Processing Unit 英文的缩写&#xff0c;电脑中一个最重要&#xff0c;最核心的东西&#xff0c;相当一个人的大脑&#xff0c;是用来思考、分析和计算的。目前市面上比较常见的CPU来自两个品牌&#xff0c;一个是intel公司生产的&#xff…

Layui源码解读之use函数(模块加载)

一、layui.use 用法 layui.use() 函数用于模块加载 layui.use([mods], callback) mods&#xff1a;如果填写(选填)&#xff0c;必须是一个 layui 合法的模块名&#xff08;不能包含目录&#xff09;。 从 layui 2.6 开始&#xff0c;若 mods 不填&#xff0c;只传一个 callbac…

StarRocks案例3: 通过[broadcast] 优化慢SQL

文章目录 一. 问题描述二. 解决方案三. 一些拓展 一. 问题描述 最近在使用StarRocks的时候&#xff0c;发现一个问题 table_a 10W 左右数据&#xff0c;通过where条件过滤数据后 剩下 10行数据。 table_b 5亿左右数据&#xff0c;通过where过滤条件后 剩下 5kw 数据。 table…

java物流快递寄件配送信息管理系统springboot+vue

物流信息管理系统分为管理员功能模块、配送员功能模块和用户功能模块三大部分&#xff0c;下面将对这三大功能模块分别进行介绍。 管理员功能模块&#xff1a;管理员登录后可对系统进行全面管理&#xff0c;管理员登录后主要实现的功能模块包括个人中心、用户管理、配送员管理、…

Deno:下载安装示例和打包为可执行文件

Deno&#xff1a;一个 安全的 JavaScript 和 TypeScript 运行时环境 目录 文档安装DenoHello World将程序打包成可执行程序 文档 官方文档 https://deno.com/manual 安装Deno Deno的解释器是一个可执行的单文件&#xff0c;下载解压即可使用 1、下载Deno 下载地址&#xf…

NFC无源标签协议

1、NFC写图片数据命令 无源NFC接口基于ISO/IEC 14443-3 A类标准&#xff1b; 命令起始地址结束地址数据 11164 67字节,每次写入的命令和地址都是一样的&#xff1b; 第一包数据必须发送该字符串数据"picksmart&M1&H128&W296&S1&C1"&#xff…