广电用户画像分析之根据用户行为数据进行筛选与标签添加

news2024/11/8 23:49:33

在数据处理和分析领域,我们经常需要根据用户的行为数据进行筛选和标签添加,以便更好地理解用户行为和偏好。在本篇博客中,我们将介绍两个示例,展示如何根据用户的收视行为数据和订单信息进行数据处理和分析。

前情提要:

数据集分析:
广电用户画像分析之探索各个表中的记录数和字段phone_no的空值数 )
数据预处理:
广电用户画像分析之数据基本分析与预处理)

根据用户收视行为数据中地区和语言偏好筛选数据

完整代码:


package code.userprint

import org.apache.spark.sql.SparkSession

object MediaPrint {
  def main(args: Array[String]): Unit = {
    System.setProperty("HADOOP_USER_NAME", "root")
    val spark = SparkSession.builder().appName("media")
      .master("local[*]")
      .enableHiveSupport()
      .getOrCreate()
    //
    spark.sparkContext.setLogLevel("WARN")

    val media = spark.table("Processdata.media_index")
    import org.apache.spark.sql.functions._

//    media.selectExpr("max(end_time) as max_month")
//    .selectExpr("add_months(max_month,-3) as beforeTime").show() // 2018-04-30

    media.filter("end_time > '2018-04-30'")
    .groupBy("phone_no","audio_lang").agg(sum("duration")/(1000*60*60)/3 as "avgduration")
    .filter("avgduration > 5").select("phone_no","audio_lang")
    .write.mode("overwrite").saveAsTable("userPrint.languagePrint")

    media.filter("end_time > '2018-04-30'")
      .groupBy("phone_no","region").agg(sum("duration")/(1000*60*60)/3 as "avgDuration")
      .filter("avgDuration > 5").select("phone_no","region")
      .write.mode("overwrite").saveAsTable("userPrint.regionPrint")

  }
}

该类的目的是根据用户观看媒体的语言和地区信息,统计其在过去三个月内的平均观看时长,并筛选出观看时长大于5小时的用户,将结果存储在两个不同的Hive表中,分别为languagePrint和regionPrint。

思路:

从表Processdata.media_index中读取数据,得到一个DataFrame对象media。

在media中筛选出end_time大于’2018-04-30’的记录。

按照phone_no和audio_lang进行分组,使用agg函数计算duration字段的总和,并将结果除以3(毫秒转换为小时),得到每月平均持续时间avgduration。

筛选出平均持续时间大于5小时的记录,选择phone_no和audio_lang两列。

将结果保存为名为languagePrint的Hive表。

再次在media中筛选出end_time大于’2018-04-30’的记录。

按照phone_no和region进行分组,使用agg函数计算duration字段的总和,并将结果除以3(毫秒转换为小时),得到每月平均持续时间avgDuration。

筛选出平均持续时间大于5小时的记录,选择phone_no和region两列。

将结果保存为名为regionPrint的Hive表。

核心代码:

val media = spark.table(“Processdata.media_index”)

media.filter(“end_time > ‘2018-04-30’”)

.groupBy(“phone_no”,“audio_lang”).agg(sum(“duration”)/(10006060)/3 as “avgduration”)

.filter(“avgduration > 5”).select(“phone_no”,“audio_lang”)

.write.mode(“overwrite”).saveAsTable(“userPrint.languagePrint”)

media.filter(“end_time > ‘2018-04-30’”)

.groupBy(“phone_no”,“region”).agg(sum(“duration”)/(10006060)/3 as “avgDuration”)

.filter(“avgDuration > 5”).select(“phone_no”,“region”)

.write.mode(“overwrite”).saveAsTable(“userPrint.regionPrint”)

根据订单信息筛选产品名称

完整代码:

package code.userprint

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.expressions.Window

object OfferName {
  def main(args: Array[String]): Unit = {
    System.setProperty("HADOOP_USER_NAME", "root")
    val spark = SparkSession.builder().appName("MediaAnalyse")
      .master("local[*]")
      .enableHiveSupport()
      .getOrCreate()
    //
    spark.sparkContext.setLogLevel("WARN")

    // 过滤 offername 不为空,且cost<=0
    val TVorder = spark.read.table("processData.order_index")
      .filter("offername is not null")
      .filter("cost > 0")
      // 筛选电视业务
      .filter("sm_name != '珠江宽频'")
    val BDorder = spark.read.table("processData.order_index")
      .filter("offername is not null")
      .filter("cost > 0")
      // 筛选宽带业务
      .filter("sm_name like '珠江宽频'")
    // 电视主销售品
    import org.apache.spark.sql.functions._
    val TVMainOffer = TVorder.filter("mode_time='Y' and offertype=0 and prodstatus='YY'")
      .select(col("phone_no"), col("offername"),
        // 以用户作为窗口分组的标准,再以 optdate 排序(根据排名),获取排名为 1 ,
        // 由于根据 optdate 进行降序排序,所以排名为 1 的即为 optdate 最大值
        row_number().over(Window.partitionBy("phone_no")
          .orderBy(desc("optdate"))) as "rn").filter("rn==1")
      .select(col("phone_no"), col("offername"))
    //      TVMainOffer.show()
    // 电视附属销售品
    val TVOffer = TVorder.filter("mode_time='Y' and offertype=0 and prodstatus='YY'")
      .select(col("phone_no"), col("offername"))
    //      TVOffer.show()
    // 宽带
    val BDDffer = BDorder.select(col("phone_no"), col("offername"),
      row_number().over(Window.partitionBy("phone_no")
        .orderBy(desc("optdate"))) as "rn").filter("rn==1")
      .select(col("phone_no"), col("offername"))
    //    BDDffer.show()
    // 拼接
        val TVOfferName = TVMainOffer.union(TVOffer).union(BDDffer).distinct()
//    val TVOfferName = TVMainOffer.union(TVOffer).union(BDDffer)
//    TVOfferName.show()
    TVOfferName.write.mode("overwrite").saveAsTable("userPrint.TVOfferName")


    // BDofferName (宽带产品构建)
    val BDOfferordeResult = BDorder.select(col("phone_no"), col("prodname"),
      row_number().over(Window.partitionBy("phone_no")
        .orderBy(desc("optdate"))) as "rn").filter("rn==1")
      .select(col("phone_no"), col("prodname"))
    BDOfferordeResult.write.mode("overwrite").saveAsTable("userPrint.BDOfferName")
  }
}

该类的目的是创建一个消费者标签(Consumer Label)。它通过读取名为mmconsume_billevents的表中的数据,根据字段"phone_no"和"fee_code"进行去重,然后使用自定义的函数consumerLabel为每个消费者分配一个标签,最后将结果保存到名为consumerLabel的表中。

思路:

读取数据:使用spark.read.table()方法从表processData.order_index中读取数据,并将其分别赋值给TVorder和BDorder两个变量。

过滤数据:对TVorder和BDorder进行过滤操作,筛选出满足条件的数据集。可以使用filter()方法和SQL表达式来实现条件过滤。

电视业务处理:

主销售品:对TVorder进行条件筛选,选择mode_time=‘Y’、offertype=0和prodstatus='YY’的数据,并按phone_no分组,按optdate降序排序,使用窗口函数row_number()获取每组中排名为1的最新数据,将结果命名为TVMainOffer。

附属销售品:对TVorder进行条件筛选,选择mode_time=‘Y’、offertype=0和prodstatus='YY’的数据,并提取phone_no和offername字段,将结果命名为TVOffer。

宽带业务处理:

宽带销售品:对BDorder进行条件筛选,选择sm_name like '珠江宽频’的数据,并按phone_no分组,按optdate降序排序,使用窗口函数row_number()获取每组中排名为1的最新数据,将结果命名为BDDffer。

合并数据:将TVMainOffer、TVOffer和BDDffer三个数据集进行合并,可以使用union()方法实现,并去重,将结果命名为TVOfferName。

保存结果:将TVOfferName数据集保存为名为TVOfferName的Hive表,使用write.mode(“overwrite”).saveAsTable(“userPrint.TVOfferName”)实现。

宽带销售品保存:对于宽带业务,根据条件筛选出最新的销售品名称数据集,将结果命名为BDOfferordeResult,然后将其保存为名为BDOfferName的Hive表,使用write.mode(“overwrite”).saveAsTable(“userPrint.BDOfferName”)实现。

核心代码:

从表processData.order_index中读取数据,并进行过滤操作,筛选出满足条件的数据集。

val TVorder = spark.read.table(“processData.order_index”)

.filter(“offername is not null”)

.filter(“cost > 0”)

.filter(“sm_name != ‘珠江宽频’”)

val BDorder = spark.read.table(“processData.order_index”)

.filter(“offername is not null”)

.filter(“cost > 0”)

.filter(“sm_name like ‘珠江宽频’”)

针对电视业务,根据一定的条件筛选出主销售品和附属销售品,并获取最新的销售品名称,构建TVMainOffer和TVOffer数据集。

val TVMainOffer = TVorder.filter(“mode_time=‘Y’ and offertype=0 and prodstatus=‘YY’”)

.select(col(“phone_no”), col(“offername”), row_number().over(Window.partitionBy(“phone_no”).orderBy(desc(“optdate”))) as “rn”)

.filter(“rn==1”)

.select(col(“phone_no”), col(“offername”))

val TVOffer = TVorder.filter(“mode_time=‘Y’ and offertype=0 and prodstatus=‘YY’”)

.select(col(“phone_no”), col(“offername”))

针对宽带业务,根据一定的条件筛选出销售品,并获取最新的销售品名称,构建BDDffer数据集。

val BDDffer = BDorder.select(col(“phone_no”), col(“offername”), row_number().over(Window.partitionBy(“phone_no”).orderBy(desc(“optdate”))) as “rn”)

.filter(“rn==1”)

.select(col(“phone_no”), col(“offername”))

将TVMainOffer、TVOffer和BDDffer三个数据集进行合并,并去重,得到最终的销售品名称数据集TVOfferName。将TVOfferName数据集保存为名为TVOfferName的Hive表。针对宽带业务,根据一定的条件筛选出销售品,并获取最新的销售品名称,构建BDOfferordeResult数据集。

val TVOfferName = TVMainOffer.union(TVOffer).union(BDDffer).distinct()

TVOfferName.write.mode(“overwrite”).saveAsTable(“userPrint.TVOfferName”)

val BDOfferordeResult = BDorder.select(col(“phone_no”), col(“prodname”), row_number().over(Window.partitionBy(“phone_no”).orderBy(desc(“optdate”))) as “rn”)

.filter(“rn==1”)

.select(col(“phone_no”), col(“prodname”))

根据业务名称和入网程度添加标签

完整代码

package code.userprint

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._
object UserMesgPrint {
  def main(args: Array[String]): Unit = {
    System.setProperty("HADOOP_USER_NAME", "root")
    val spark = SparkSession.builder().appName("Process")
      .master("local[*]")
      .enableHiveSupport()
      .getOrCreate()
    //
    spark.sparkContext.setLogLevel("WARN")

    val userMsg = spark.table("processData.mediamatch_usermsg")

    // 业务品牌
    userMsg.filter("sm_code != 'a0' and sm_code != 'b1'")
      .select("phone_no","sm_name")
      .write.mode("overwrite").saveAsTable("userprint.ProductOffer")

    val TV = spark.read.table("processData.mediamatch_usermsg")
      // 筛选电视业务
      .filter("sm_name != '珠江宽频'")
    val BD = spark.read.table("processData.mediamatch_usermsg")
      // 筛选电视业务
      .filter("sm_name like '珠江宽频'")
      .filter("sm_code == 'b0'")
      .filter("force like '宽带生效'")

    // 用户电视入网
    val TVOpenTime = TV.select(col("phone_no"),col("open_time"),
      row_number().over(Window.partitionBy("phone_no")
        .orderBy(desc("open_time") )) as "rn")
      .filter("rn==1")
      .select(col("phone_no"),col("open_time"))
    TVOpenTime.show()
    val TVtime = TVOpenTime.withColumn("T",months_between(from_unixtime(unix_timestamp(),"yyyy-MM-dd HH:mm:ss"),col("open_time")))
    TVtime.show()

    // 用户电视入网标签构建
    val TVLabelUdf = udf((x:Double)=>TVLabel(x))
    TVtime.withColumn("TVLabel",TVLabelUdf(col("T"))).write.mode("overwrite").saveAsTable("userPrint.TVUseLabel")

    // 用户宽带入网
    val BDOpenTime = BD.select(col("phone_no"),col("open_time"),
      row_number().over(Window.partitionBy("phone_no")
        .orderBy(desc("open_time") )) as "rn")
      .filter("rn==1")
      .select(col("phone_no"),col("open_time"))
    BDOpenTime.show()
    val BDtime = BDOpenTime.withColumn("T",months_between(from_unixtime(unix_timestamp(),"yyyy-MM-dd HH:mm:ss"),col("open_time")))
    BDtime.show()

    // 用户宽带入网标签构建
    val BDLabelUdf = udf((x:Double)=>BDLabel(x))
    BDtime.withColumn("BDLabel",BDLabelUdf(col("T"))).write.mode("overwrite").saveAsTable("userPrint.BDUseLabel")


  }
  def TVLabel(T:Double): String = {
    if (T > 6) {
      "老用户"
    } else if (T < 3) {
      "新用户"
    } else {
      "中等用户"
    }
  }
    def BDLabel(T:Double): String ={
      if (T>4){
        "老用户"
      }else if(T<=2){
        "新用户"
      }else{
        "中等用户"
      }
  }
}

该类的目的是根据用户的电视业务和宽带业务数据,进行数据处理和分析,以实现以下核心目标:

(1)业务品牌处理:将用户的业务品牌数据进行筛选和处理,提取出符合条件的业务品牌信息,并保存到指定的表中。

(2)电视业务处理:

提取用户的电视业务数据。

计算每个用户的电视入网时间,并与当前时间进行比较,得出入网时长。

根据入网时长,对用户进行分类标记,划分为新用户、老用户和中等用户,并将结果保存到指定的表中。

(3)宽带业务处理:

提取用户的宽带业务数据。

计算每个用户的宽带入网时间,并与当前时间进行比较,得出入网时长。

根据入网时长,对用户进行分类标记,划分为新用户、老用户和中等用户,并将结果保存到指定的表中。

思路:

读取数据:使用spark.table()方法从表processData.mediamatch_usermsg中读取数据,并将其赋值给userMsg变量。

业务品牌处理:对userMsg进行条件筛选,去除sm_code为’a0’和’b1’的数据,然后选择phone_no和sm_name字段,将结果保存为名为ProductOffer的Hive表。

电视业务处理:

(1)数据筛选:对userMsg进行条件筛选,选择sm_name不等于’珠江宽频’的数据,并将结果赋值给TV变量。

(2)用户电视入网时间:使用窗口函数row_number()和desc(“open_time”)对TV进行分组排序,获取每个用户的最新入网时间,并将结果命名为TVOpenTime。

(3)计算入网时长:使用函数months_between()计算当前时间和入网时间之间的月份差,并将结果命名为T。

(4)用户电视入网标签构建:定义TVLabel函数,根据入网时长T的值判断用户的入网标签,返回相应的标签字符串。

(5)将入网时间和入网标签合并,并将结果保存为名为TVUseLabel的Hive表。

宽带业务处理:

(1)数据筛选:对userMsg进行条件筛选,选择sm_name为’珠江宽频’、sm_code为’b0’、force为’宽带生效’的数据,并将结果赋值给BD变量。

(2)用户宽带入网时间:使用窗口函数row_number()和desc(“open_time”)对BD进行分组排序,获取每个用户的最新入网时间,并将结果命名为BDOpenTime。

(3)计算入网时长:使用函数months_between()计算当前时间和入网时间之间的月份差,并将结果命名为T。

(4)用户宽带入网标签构建:定义BDLabel函数,根据入网时长T的值判断用户的入网标签,返回相应的标签字符串。

(5)将入网时间和入网标签合并,并将结果保存为名为BDUseLabel的Hive表。

核心代码:

从电视业务数据筛选和入网时间计算:

val TV = spark.read.table(“processData.mediamatch_usermsg”)

.filter(“sm_name != ‘珠江宽频’”)

val TVOpenTime = TV.select(col(“phone_no”), col(“open_time”),

row_number().over(Window.partitionBy(“phone_no”).orderBy(desc(“open_time”))) as “rn”)

.filter(“rn==1”)

.select(col(“phone_no”), col(“open_time”))

val TVtime = TVOpenTime.withColumn(“T”, months_between(from_unixtime(unix_timestamp(), “yyyy-MM-dd HH:mm:ss”), col(“open_time”)))


这段代码首先从输入数据中选择电视业务数据,并筛选出符合条件的数据。然后,通过窗口函数和排序操作,计算每个用户的最早入网时间,并提取出用户手机号和入网时间。最后,利用当前时间和入网时间计算出用户的入网时长。

电视业务用户标签构建和结果保存:

val TVLabelUdf = udf((x: Double) => TVLabel(x))

TVtime.withColumn(“TVLabel”, TVLabelUdf(col(“T”))).write.mode(“overwrite”).saveAsTable(“userPrint.TVUseLabel”)


这段代码定义了一个用户自定义函数 TVLabelUdf,用于根据入网时长对用户进行分类标记。然后,将入网时间和分类标记列添加到数据集中,并将结果保存到指定的表中。

宽带业务数据筛选和入网时间计算:

val BD = spark.read.table(“processData.mediamatch_usermsg”)

.filter(“sm_name like ‘珠江宽频’”)

.filter(“sm_code == ‘b0’”)

.filter(“force like ‘宽带生效’”)

val BDOpenTime = BD.select(col(“phone_no”), col(“open_time”),

row_number().over(Window.partitionBy(“phone_no”).orderBy(desc(“open_time”))) as “rn”)

.filter(“rn==1”)

.select(col(“phone_no”), col(“open_time”))

val BDtime = BDOpenTime.withColumn(“T”, months_between(from_unixtime(unix_timestamp(), “yyyy-MM-dd HH:mm:ss”), col(“open_time”)))


这段代码和第一段代码类似,只是针对宽带业务数据进行了筛选,并计算了每个用户的最早入网时间和入网时长。

宽带业务用户标签构建和结果保存:

val BDLabelUdf = udf((x: Double) => BDLabel(x))

BDtime.withColumn(“BDLabel”, BDLabelUdf(col(“T”))).write.mode(“overwrite”).saveAsTable(“userPrint.BDUseLabel”)

这段代码也类似于第二段代码,定义了一个用户自定义函数 BDLabelUdf,用于根据入网时长对宽带用户进行分类标记。然后,将入网时间和分类标记列添加到数据集中,并将结果保存到指定的表中。

以上是核心代码的简要介绍,分别展示了电视业务数据的处理和标记以及宽带业务数据的处理和标记。每段代码都有相应的文字介绍说明其功能和操作。

遇到的一些问题:

长时间运行不出结果:
运行OfferName程序时出现长时间不输出也不结束的阻塞情况.具体情况如下图所示:

image.png
可能是Windows下内存不足,而在虚拟机里运行时因为虚拟机使用的是虚拟内存,相对Windows的内存空间更大,因此解决方式就是放在虚拟机中运行.

而手动中断后再次运行,会报错报错说此hive表已存在,但在命令行里去show tables;是找不到这个表的.虽然这表没有建立,但表的映射文件已经建立,此时是需要删除映射即可:

hdfs dfs -rm -r hdfs://node01:9000/hive/warehouse/userprint.db/tvoffername

回归原本的问题,解决方式为将程序打包放在虚拟机里运行.

打包流程如下图所示:

image.png

image.png

image.png

image.png

image.png
改名并上传到/opt然后运行.运行指令为:
spark-submit --master spark://master:7077 --class code.userprint.OfferName /opt/scala.jar

检查是否运行成功,查看表里是否生成了数据,成功结果如下图所示:

image.png

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

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

相关文章

创新型影像测量仪器有哪些

走新型工业化之路&#xff0c;加快重塑竞争新优势&#xff0c;离不开更强的创新能力、更高的创新效率。新型工业化道路的基本标志和落脚点是要做到“科技含量高、经济效益好、资源消耗低、环境污染少、人力资源优势得到充分发挥”&#xff0c;并实现这几方面的兼顾和统一。而不…

spring boot 项目实现打包依赖分离

spring boot version 2.7 &#xff08;理论上是通用的&#xff09;Maven version 3 打包结果 重要文件以及文件夹解释 lib: 存在当前项目的全部依赖 other&#xff1a;和当前项目的 groupID 不同的依赖 project&#xff1a;和当前项目groupID 相同的依赖 XX-3.0.0-SNAPSHOT.j…

jdk安装及配置

一、下载安装包&#xff1a; 阿里云盘分享 提取码&#xff1a;am66 双击该程序 点击下一步 稍作等待即可。 二、配置环境变量 再新建一个系统变量CLASSPATH .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar 找到Path变量&#xff0c;双击编辑 Path变量。点击新建&…

【深度学习】GPT-2

在GPT1问世不久&#xff0c;和GPT很相似的BERT横空出世&#xff0c;并且在各方面都超越GPT-1。OpenAI在《Language Models are Unsupervised Multitask Learners》中于2019年提出的GPT-2&#xff0c;全称为Generative Pre-Training 2.0。提出语言模型式无监督的多任务学习 &…

DDS 信号发生器实验

目录 DDS 信号发生器实验 1、DDS 简介 2、实验任务 3、程序设计 3.1、DDS 顶层模块代码 3.2、clk_wiz IP 核 3.3、ILA IP 核&#xff08;集成逻辑分析器&#xff1a;Integrated Logic Analyzer&#xff0c;ILA&#xff09; 3.4、各波形参考代码 3.4.1、正弦信号波形采…

身份识别与访问管理(IAM)工具

AD360 是一款企业 IAM 解决方案&#xff0c;可帮助管理身份、保护访问并确保合规性。它具有强大的功能&#xff0c;例如自动化身份生命周期管理、安全 SSO、自适应 MFA、基于审批的工作流、UBA 驱动的身份威胁防护和历史审计报告。AD360 直观的界面和强大的功能使其成为满足现代…

行业云统领2023十大技术趋势,新华三把脉数实融合演进路径

“每一年的科技突破与环境变局&#xff0c;有一定的随机性又有一定的必然性&#xff0c;导致人类社会永远处于动态塑形的过程。”中国工程院院士陈晓红在想像未来的技术变化时认为&#xff1a;“无论怎么变化&#xff0c;人类未来图景仍然源于社会生活与经济发展的真实需求”。…

了解MySQL配置文件:位置、结构和选项

目录 1 MySQL配置文件的位置2 MySQL配置文件的结构3 MySQL配置选项4 [mysqld]部分&#xff1a;5 [client]部分&#xff1a;6 MySQL配置文件的重要性7 总结 本文详细介绍了MySQL配置文件的位置、结构和常用选项。了解如何使用MySQL配置文件来管理和配置MySQL服务器的行为和属性。…

5. QT环境下使用OPenCV(基于TCP实现摄像头图像数据的多线程传输)

1. 说明 通常情况下对于图像数据的采集可以放在后端进行,采集到的图像数据如果有需要可以通过通信将数据传输到前端进行显示,这其中需要使用到TCP数据传输协议和QT下的多线程开发技术。QT当中主线程一般是界面层次的,在主线程中执行耗时较长的数据操作,会引起界面的卡顿,…

React学习9 Router6

使用 userRoutes路由表 注册路由 Outlet指定路由组件呈现位置 ***很重要&#xff0c;userNavigate()实现编程式路由导航 函数式组件接收params参数的hook useParams() 接受search参数 接收state参数 userNavigate 实现前进后退 判断是否处于路由组件中&#xff0c;在路由器管理…

网站加密防止拷贝的php域名授权方法

1 public function getdata()2 $method DES-ECB;//加密方法3 $passwd qq496631085;//加密密钥4 $options 0;//数据格式选项&#xff08;可选&#xff09;5 $iv ;//加密初始化向量&#xff08;可选&#xff09;6 $url ba…

双因素身份验证在远程访问中的重要性

在快速发展的数字环境中&#xff0c;远程访问计算机和其他设备已成为企业运营的必要条件。无论是在家庭办公室运营的小型初创公司&#xff0c;还是团队分散在全球各地的跨国公司&#xff0c;远程访问解决方案都能保证工作效率和连接性&#xff0c;能够跨越距离和时间的阻碍。 …

MQTT(二)Java整合MQTT

Java整合MQTT 上一节知道MQTT是一个通信协议&#xff0c;需要一个代理服务Broker&#xff1b;通信设备作为客户端Client&#xff0c;后台系统服务器也作为客户端Client。 经过了解选用EMQX作为代理服务Broker&#xff08;支持WEB界面查看&#xff09; 后台服务使用Spring In…

【教学类-36-01】Midjounery生成的四张图片切片成四张小图

作品展示&#xff1a; 把一张正方形图片的四个等大小图切割成四张图片 背景需求 最近在学习ChatGPT的绘画&#xff08;midjounery AI艺术&#xff09; 我想给中班孩子找卡通动物图片&#xff08;黑白线条&#xff09;&#xff0c;打印下来&#xff0c;孩子们练习描边、涂色…

【发布】ChatGLM2-6B:性能大幅提升,8-32k上下文,推理提速42%

自3月14日发布以来&#xff0c; ChatGLM-6B 深受广大开发者喜爱&#xff0c;截至 6 月24日&#xff0c;来自 Huggingface 上的下载量已经超过 300w。 为了更进一步促进大模型开源社区的发展&#xff0c;我们再次升级 ChatGLM-6B&#xff0c;发布 ChatGLM2-6B 。 在主要评估LLM模…

《C++ Primer》--学习7

顺序容器 容器库概览 迭代器 与容器一样&#xff0c;迭代器有着公共的接口&#xff1a;如果一个迭代器提供某个操作&#xff0c;那么所有提供相同操作的迭代器对这个操作的实现方式都是相同的。 迭代器范围 一个迭代器范围是由一对迭代器表示&#xff0c;两个迭代器分别指向…

剪辑必备技巧:轻松去除视频中的多余物体

在视频剪辑过程中&#xff0c;有时我们需要去除视频中的多余物体&#xff0c;以提升视觉效果和观赏体验。今天将为您介绍一些实用的技巧&#xff0c;帮助您轻松去除视频中的多余物体&#xff0c;让您的剪辑作品更加精彩。 一、选择适当的剪辑软件进行剪辑操作 一些专业的剪辑…

基于MATLAB实现KECA、PCA和KPCA的多阶段发酵过程监测方法毕业设计(完整源码+说明文档+PPT+开题报告+数据)

文章目录&#xff0c;完整源码在文末 1. 研究目标2. 主要研究内容3. 技术路线4. 预期成果5. 功能说明6. 参考文献7. 完整仿真源码下载 1. 研究目标 实现基于KECA的青霉素发酵过程故障监测 2. 主要研究内容 1.针对KPCA监测算法在数据降维过程中簇结构信息丢失的问题&#xff…

BootStrap案例

BootStrap是已经写好的css样式 &#xff08;1&#xff09;下载BootStrap 解压后放在 static文件夹–>plugins(存放插件)–>bootstrap-3.4.1 &#xff08;2&#xff09;使用 在页面上引入BootStrap 编写HTML时&#xff0c;按照BootStrap的规定来编写自定制 开发版本(一…

Web服务器群集:部署LNMP平台(yum方式安装)

目录 一、理论 1.yum安装与源码安装的区别 二、实验 1.Nginx安装&#xff08;yum方式&#xff09; 2.MySQL安装&#xff08;yum方式&#xff09; 3.PHP安装&#xff08;yum方式&#xff09; 4.Nginx 配置 三、问题 1.客户端 404 报错 四、总结 一、理论 1.yum安装与…