【Spark分布式内存计算框架——离线综合实战】6. 广告投放的地域分布

news2025/7/14 16:21:04

3.3 广告投放的地域分布

按照产品需求,需要完成如下统计的报表:
在这里插入图片描述
从上面的统计报表可以看出,其中包含三个“率”计算,说明如下:
在这里插入图片描述

报表字段信息
针对广告投放的地域分布统计,各个指标字段信息说明如下:

Column(列名称)Type(列类型)Comment(列含义)
provincestring NOT NULL
citystring NOT NULL
orginal_req_cntlong NOT NULL原始请求数
valid_req_cntlong NOT NULL有效请求数
ad_req_cntlong NOT NULL广告请求数
join_rtx_cntlong NOT NULL参与竞价数
success_rtx_cntlong NOT NULL竞价成功数
ad_show_cntlong NOT NULL广告展示数量
ad_click_cntlong NOT NULL广告点击量
media_show_cntlong NOT NULL媒介展示量
media_click_cntlong NOT NULL媒介点击量
dsp_pay_moneylong NOT NULL广告成本
dsp_cost_moneylong NOT NULL广告消费
success_rtx_ratedouble NOT NULL竞价成功率
ad_click_rate doubleNOT NULL广告点击率
media_click_rate doubleNOT NULL媒体点击率

数据库创建表
在MySQL数据库【itcast_ads_report】中创建表【ads_region_analysis】,以便将结果数据保存,创建语句如下:

-- 创建表
-- DROP TABLE IF EXISTS itcast_ads_report.ads_region_analysis ;
CREATE TABLE `itcast_ads_report`.`ads_region_analysis` (
`report_date` varchar(255) NOT NULL,
`province` varchar(255) NOT NULL,
`city` varchar(255) NOT NULL,
`orginal_req_cnt` bigint DEFAULT NULL,
`valid_req_cnt` bigint DEFAULT NULL,
`ad_req_cnt` bigint DEFAULT NULL,
`join_rtx_cnt` bigint DEFAULT NULL,
`success_rtx_cnt` bigint DEFAULT NULL,
`ad_show_cnt` bigint DEFAULT NULL,
`ad_click_cnt` bigint DEFAULT NULL,
`media_show_cnt` bigint DEFAULT NULL,
`media_click_cnt` bigint DEFAULT NULL,
`dsp_pay_money` bigint DEFAULT NULL,
`dsp_cost_money` bigint DEFAULT NULL,
`success_rtx_rate` double DEFAULT NULL,
`ad_click_rate` double DEFAULT NULL,
`media_click_rate` double DEFAULT NULL,
PRIMARY KEY (`report_date`,`province`,`city`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ;

广告数据表相关字段
针对广告投放的地域分布统计需求,涉及到【广告数据表pmt_ads_info】相关字段:

字段解释
requestmode数据请求方式, 一般请求可能有三种, 如下 1 : 请求 2 : 展示 3 : 点击
processnode流程节点, 1 : 请求量KPI, 只计算请求量 2 : 有效请求, 是一个有效的请求, 有效的请求可能也有一部分系统管理的请求 3 : 广告请求, 是一个和广告有关的请求
adplatformproviderid广告平台商ID, >= 100000 : AdExchange、 < 100000 : AdNetwork
iseffective是否可以正常计费
isbilling是否收费
isbid是否是 RTB
adorderid广告 ID
adcreativeid广告创意 ID, >= 200000 : DSP、 < 200000 : OSS
winpriceRTB 竞价成功价格
adpayment转换后的广告消费 (保留小数点后 6 位)

将各个指标与业务字段关联,编写SQL或DSL实现统计分析。

指标逻辑
完成广告投放地域分区报表,需要如下的指标逻辑:
在这里插入图片描述
其中说明几点说明:
在这里插入图片描述
各个指标对于统计方式(使用类SQL表示)如下所示:

指标说明统计方式
原始请求收到所有原始请求数量requestmode = 1 and processnode >= 1
有效请求有效请求的数量requestmode = 1 and processnode >= 2
广告请求广告请求的数量requestmode = 1 and processnode = 3
参与竞价数参与竞价的数量adplatformproviderid >= 100000 and iseffective = 1 and isbilling = 1 and isbid = 1 and adorderid != 0
竞价成功数成功竞价的数量adplatformproviderid >= 100000 and iseffective = 1 and isbilling = 1 and iswin = 1 and adorderid != 0
广告主展示数广告主的广告请求被展示的数量requestmode = 2 and iseffective = 1
广告主点击数广告主的广告请求被点击的数量requestmode = 3 and iseffective = 1 and adorderid != 0
媒介展示数媒介:广告在终端被展示的数量requestmode = 2 and iseffective = 1 and isbilling=1 and isbid = 1 and iswin = 1
媒介点击数媒介:广告在终端被点击的数量requestmode = 3 and iseffective = 1 and isbilling=1 and isbid = 1 and iswin = 1
DSP 广告消费winprice/1000adplatformproviderid >= 100000 and iseffective = 1 and isbilling=1 and iswin = 1 and adorderid > 200000 and adcreativeid > 200000
DSP广告成本adpayment/1000adplatformproviderid >= 100000 and iseffective = 1 and isbilling=1 and isbid = 1 and iswin = 1 and adorderid > 200000 and adcreativeid > 200000

可以看出各个指标计算,主要就是条件判断(使用CASE函数),再使用count/sum聚合函数即可。

报表分析
创建类【AdsRegionAnalysisReport.scala】,定义【report】方法,传递参数DataFrame,实现思路分为两步:

/*
不同业务报表统计分析时,两步骤:
i. 编写SQL或者DSL分析
ii. 将分析结果保存MySQL数据库表中
*/

整体代码框架如下,具体报表分析封装到方法中和保存结果封装到【saveResultToMySQL】方法,为了方便简洁直接使用DataFrame中format(“jdbc”):

package cn.itcast.spark.report
import cn.itcast.spark.config.ApplicationConfig
import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}
import org.apache.spark.sql.types.StringType
/**
* 广告区域统计:ads_region_analysis,区域维度:省份和城市
*/
object AdsRegionAnalysisReport {
/*
不同业务报表统计分析时,两步骤:
i. 编写SQL或者DSL分析
ii. 将分析结果保存MySQL数据库表中
*/
def doReport(dataframe: DataFrame) = {
// 第一、计算报表
//val resultDF: DataFrame = reportWithSql(dataframe) // sql 编程
//val resultDF: DataFrame = reportWithKpiSql(dataframe) // sql编程
//val resultDF: DataFrame = reportWithDsl(dataframe) // dsl 编程
// 第二、保存数据
//resultDF.show(20 ,truncate = false)
saveResultToMySQL(resultDF)
}
/**
* 保存数据至MySQL表中,直接使用DataFrame Writer操作,但是不符合实际应用需求
*/
def saveResultToMySQL(dataframe: DataFrame): Unit = {
dataframe
.coalesce(1)
.write
.mode(SaveMode.Append)
.format("jdbc")
// 设置MySQL数据库相关属性
.option("driver", ApplicationConfig.MYSQL_JDBC_DRIVER)
.option("url", ApplicationConfig.MYSQL_JDBC_URL)
.option("user", ApplicationConfig.MYSQL_JDBC_USERNAME)
.option("password", ApplicationConfig.MYSQL_JDBC_PASSWORD)
.option("dbtable", "itcast_ads_report.ads_region_analysis")
.save()
}
}

基于SQL分析
先依据需求编写SQL,三率指标(竞价成功率、广告点击率、媒体点击率)依赖于其他指标计算,所以使用SQL子查询方式,将SQL封装到特质:ReportSQLConstant中。

package cn.itcast.spark.report
/**
* 统计报表的SQL语句
*/
object ReportSQLConstant {
/**
* 广告投放的地域分布的SQL语句
* @param tempViewName DataFrame注册的临时视图名称
*/
def reportAdsRegionSQL(tempViewName: String): String = {
// 在Scala语言中,字符串可以使用双引号和三引号
s"""
|SELECT
| cast(date_sub(current_date(), 1) AS string) AS report_date,
| t.province, t.city,
| SUM(
| CASE
| WHEN (t.requestmode = 1 and t. processnode >= 1)
| THEN 1
| ELSE 0
| END
| ) AS orginal_req_cnt,
| SUM(
| CASE
| WHEN (t.requestmode = 1 and t.processnode >= 2)
| THEN 1
| ELSE 0
| END
| ) AS valid_req_cnt,
| SUM(
| CASE
| WHEN (t.requestmode = 1 and t.processnode = 3)
| THEN 1
| ELSE 0
| END
| ) AS ad_req_cnt,
| SUM(CASE
| WHEN (t.adplatformproviderid >= 100000
| AND t.iseffective = 1
| AND t.isbilling = 1
| AND t.isbid = 1
| AND t.adorderid != 0) THEN 1
| ELSE 0
| END) AS join_rtx_cnt,
| SUM(CASE
| WHEN (t.adplatformproviderid >= 100000
| AND t.iseffective = 1
| AND t.isbilling = 1
| AND t.iswin = 1) THEN 1
| ELSE 0
| END) AS success_rtx_cnt,
| SUM(CASE
| WHEN (t.requestmode = 2
| AND t.iseffective = 1) THEN 1
| ELSE 0
| END) AS ad_show_cnt,
| SUM(CASE
| WHEN (t.requestmode = 3
| AND t.iseffective = 1) THEN 1
| ELSE 0
| END) AS ad_click_cnt,
| SUM(CASE
| WHEN (t.requestmode = 2
| AND t.iseffective = 1
| AND t.isbilling = 1) THEN 1
| ELSE 0
| END) AS media_show_cnt,
| SUM(CASE
| WHEN (t.requestmode = 3
| AND t.iseffective = 1
| AND t.isbilling = 1) THEN 1
| ELSE 0
| END) AS media_click_cnt,
| SUM(CASE
| WHEN (t.adplatformproviderid >= 100000
| AND t.iseffective = 1
| AND t.isbilling = 1
| AND t.iswin = 1
| AND t.adorderid > 200000
| AND t.adcreativeid > 200000) THEN floor(t.winprice / 1000)
| ELSE 0
| END) AS dsp_pay_money,
| SUM(CASE
| WHEN (t.adplatformproviderid >= 100000
| AND t.iseffective = 1
| AND t.isbilling = 1
| AND t.iswin = 1
| AND t.adorderid > 200000
| AND t.adcreativeid > 200000) THEN floor(t.adpayment / 1000)
| ELSE 0
| END) AS dsp_cost_money
|FROM
| $tempViewName t
|GROUP BY
| t.province, t.city
|""".stripMargin
}
/**
* 统计竞价成功率、广告点击率、媒体点击率的SQL
*/
def reportAdsRegionRateSQL(tempViewName: String): String = {
s"""
|SELECT
| t.*,
| round(t.success_rtx_cnt / t.join_rtx_cnt, 2) AS success_rtx_rate,
| round(t.ad_click_cnt / t.ad_show_cnt, 2) AS ad_click_rate,
| round(t.media_click_cnt / t.media_show_cnt, 2) AS media_click_rate
|FROM
| $tempViewName t
|WHERE
| t.join_rtx_cnt != 0 AND t.success_rtx_cnt != 0
| AND t.ad_show_cnt != 0 AND t.ad_click_cnt != 0
| AND t.media_show_cnt != 0 AND t.media_click_cnt != 0
|""".stripMargin
}
}

在【AdsRegionAnalysisReport】类中,定义【reportWithSql】方法,使用SQL分析:

/**
* 使用SQL方式计算广告投放报表
*/
def reportWithSql(dataframe: DataFrame): DataFrame = {
// 从DataFrame中获取SparkSession对象
val spark: SparkSession = dataframe.sparkSession
/*
在SparkSQL中使用SQL分析数据时,步骤分为两步:
- 第一步、将DataFrame注册为临时视图
- 第二步、编写SQL语句,使用SparkSession执行
*/
// i. 注册广告数据集为临时视图:tmp_view_pmt
dataframe.createOrReplaceTempView("tmp_view_pmt")
// ii. 编写SQL并执行获取结果
val reportDF: DataFrame = spark.sql(
ReportSQLConstant.reportAdsRegionSQL("tmp_view_pmt")
)
//reportDF.printSchema()
//reportDF.show(20, truncate = false)
// iii. 为了计算“三率”首先注册DataFrame为临时视图
reportDF.createOrReplaceTempView("tmp_view_report")
// iv. 编写SQL并执行获取结果
val resultDF: DataFrame = spark.sql(
ReportSQLConstant.reportAdsRegionRateSQL("tmp_view_report")
)
//resultDF.printSchema()
//resultDF.show(20, truncate = false)
// iii. 返回结果
resultDF
}

运行PmtReportRunner类,保存至MySQL数据库表中:
在这里插入图片描述
上述SQL使用子查询方式,需要两次注册DataFrame为临时视图,编写SQL语句,可以使用With As语句优化。

优化SQL:With As 语句
当书写一些结构相对复杂的SQL语句时,可能某个子查询在多个层级多个地方存在重复使用的情况,可以使用 WITH AS 语句将其独立出来,极大提高SQL可读性,简化SQL,语法如下:

WITH t1 AS (
SELECT *
FROM carinfo
),
t2 AS (
SELECT *
FROM car_blacklist
)
SELECT *
FROM t1, t2 ;

WITH AS 也叫做子查询部分,首先定义一个SQL片段,该SQL片段会被整个SQL语句所用到。WITH AS 就类似于一个视图或临时表,属于一次性的,而且必须要和其他sql一起使用才可以。其最大的好处就是适当的提高代码可读性,而且如果with子句在后面要多次使用到,可以大大的简化SQL;更重要的是:一次分析,多次使用,这也是为什么会提供性能的地方,达到了“少读”的目标。

在【ReportSQLConstant】中添加【reportAdsRegionKpiSQL】方法,使用WITH AS实现SQL:

/**
* 使用WITH AS 子查询语句分析
* @param tempViewName 视图名称
* @return
*/
def reportAdsRegionKpiSQL(tempViewName: String): String = {
s"""
|WITH tmp AS (
| SELECT
| cast(date_sub(current_date(), 1) AS string) AS report_date,
| t.province, t.city,
| SUM(
| CASE
| WHEN (t.requestmode = 1 and t. processnode >= 1)
| THEN 1
| ELSE 0
| END
| ) AS orginal_req_cnt,
| SUM(
| CASE
| WHEN (t.requestmode = 1 and t.processnode >= 2)
| THEN 1
| ELSE 0
| END
| ) AS valid_req_cnt,
| SUM(
| CASE
| WHEN (t.requestmode = 1 and t.processnode = 3)
| THEN 1
| ELSE 0
| END
| ) AS ad_req_cnt,
| SUM(CASE
| WHEN (t.adplatformproviderid >= 100000
| AND t.iseffective = 1
| AND t.isbilling = 1
| AND t.isbid = 1
| AND t.adorderid != 0) THEN 1
| ELSE 0
| END) AS join_rtx_cnt,
| SUM(CASE
| WHEN (t.adplatformproviderid >= 100000
| AND t.iseffective = 1
| AND t.isbilling = 1
| AND t.iswin = 1) THEN 1
| ELSE 0
| END) AS success_rtx_cnt,
| SUM(CASE
| WHEN (t.requestmode = 2
| AND t.iseffective = 1) THEN 1
| ELSE 0
| END) AS ad_show_cnt,
| SUM(CASE
| WHEN (t.requestmode = 3
| AND t.iseffective = 1) THEN 1
| ELSE 0
| END) AS ad_click_cnt,
| SUM(CASE
| WHEN (t.requestmode = 2
| AND t.iseffective = 1
| AND t.isbilling = 1) THEN 1
| ELSE 0
| END) AS media_show_cnt,
| SUM(CASE
| WHEN (t.requestmode = 3
| AND t.iseffective = 1
| AND t.isbilling = 1) THEN 1
| ELSE 0
| END) AS media_click_cnt,
| SUM(CASE
| WHEN (t.adplatformproviderid >= 100000
| AND t.iseffective = 1
| AND t.isbilling = 1
| AND t.iswin = 1
| AND t.adorderid > 200000
| AND t.adcreativeid > 200000) THEN floor(t.winprice / 1000)
| ELSE 0
| END) AS dsp_pay_money,
| SUM(CASE
| WHEN (t.adplatformproviderid >= 100000
| AND t.iseffective = 1
| AND t.isbilling = 1
| AND t.iswin = 1
| AND t.adorderid > 200000
| AND t.adcreativeid > 200000) THEN floor(t.adpayment / 1000)
| ELSE 0
| END) AS dsp_cost_money
| FROM
| $tempViewName t
| GROUP BY
| t.province, t.city
|)
|SELECT
| tt.*,
| round(tt.success_rtx_cnt / tt.join_rtx_cnt, 2) AS success_rtx_rate,
| round(tt.ad_click_cnt / tt.ad_show_cnt, 2) AS ad_click_rate,
| round(tt.media_click_cnt / tt.media_show_cnt, 2) AS media_click_rate
|FROM
| tmp tt
|WHERE
| tt.join_rtx_cnt != 0 AND tt.success_rtx_cnt != 0
| AND tt.ad_show_cnt != 0 AND tt.ad_click_cnt != 0
| AND tt.media_show_cnt != 0 AND tt.media_click_cnt != 0
|""".stripMargin
}

再在【AdsRegionAnalysisReport】类中,定义【reportWithKpiSql】方法,使用SQL分析:

/**
* 使用SQL方式计算广告投放报表
*/
def reportWithKpiSql(dataframe: DataFrame): DataFrame = {
// 从DataFrame中获取SparkSession对象
val spark: SparkSession = dataframe.sparkSession
/*
在SparkSQL中使用SQL分析数据时,步骤分为两步:
- 第一步、将DataFrame注册为临时视图
- 第二步、编写SQL语句,使用SparkSession执行
*/
// i. 注册广告数据集为临时视图:tmp_view_pmt
dataframe.createOrReplaceTempView("tmp_view_pmt")
// ii. 编写SQL并执行获取结果
val kpiSql: String = ReportSQLConstant.reportAdsRegionKpiSQL("tmp_view_pmt")
//println(kpiSql)
val reportDF: DataFrame = spark.sql(kpiSql)
//reportDF.show(20, truncate = false)
// iii. 返回结果
reportDF
}

基于DSL分析
使用DataFrame API和函数实现上述SQL语句功能,在【AdsRegionAnalysisReport】类中,定义【reportWithDsl】方法,代码如下:

/**
* 使用DSL方式计算广告投放报表
*/
def reportWithDsl(dataframe: DataFrame): DataFrame = {
// i. 导入隐式转换及函数库
import dataframe.sparkSession.implicits._
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types.StringType
// ii. 报表开发
val reportDF: DataFrame = dataframe
// 第一步、按照维度分组:省份和城市
.groupBy($"province", $"city")
// 第二步、使用agg进行聚合操作, 主要使用CASE...wHEN...函数和SUM函数
.agg(
// 原始请求:requestmode = 1 and processnode >= 1
sum(
when($"requestmode".equalTo(1)
.and($"processnode".geq(1)), 1
).otherwise(0)
).as("orginal_req_cnt"),
// 有效请求:requestmode = 1 and processnode >= 2
sum(
when($"requestmode".equalTo(1)
.and($"processnode".geq(2)), 1
).otherwise(0)
).as("valid_req_cnt"),
// 广告请求:requestmode = 1 and processnode = 3
sum(
when($"requestmode".equalTo(1)
.and($"processnode".equalTo(3)), 1
).otherwise(0)
).as("ad_req_cnt"),
// 参与竞价数
sum(
when($"adplatformproviderid".geq(100000)
.and($"iseffective".equalTo(1))
.and($"isbilling".equalTo(1))
.and($"isbid".equalTo(1))
.and($"adorderid".notEqual(0)), 1
).otherwise(0)
).as("join_rtx_cnt"),
// 竞价成功数
sum(
when($"adplatformproviderid".geq(100000)
.and($"iseffective".equalTo(1))
.and($"isbilling".equalTo(1))
.and($"iswin".equalTo(1))
.and($"adorderid".notEqual(0)), 1
).otherwise(0)
).as("success_rtx_cnt"),
// 广告主展示数: requestmode = 2 and iseffective = 1
sum(
when($"requestmode".equalTo(2)
.and($"iseffective".equalTo(1)), 1
).otherwise(0)
).as("ad_show_cnt"),
// 广告主点击数: requestmode = 3 and iseffective = 1 and adorderid != 0
sum(
when($"requestmode".equalTo(3)
.and($"iseffective".equalTo(1))
.and($"adorderid".notEqual(0)), 1
).otherwise(0)
).as("ad_click_cnt"),
// 媒介展示数
sum(
when($"requestmode".equalTo(2)
.and($"iseffective".equalTo(1))
.and($"isbilling".equalTo(1))
.and($"isbid".equalTo(1))
.and($"iswin".equalTo(1)), 1
).otherwise(0)
).as("media_show_cnt"),
// 媒介点击数
sum(
when($"requestmode".equalTo(3)
.and($"iseffective".equalTo(1))
.and($"isbilling".equalTo(1))
.and($"isbid".equalTo(1))
.and($"iswin".equalTo(1)), 1
).otherwise(0)
).as("media_click_cnt"),
// DSP 广告消费
sum(
when($"adplatformproviderid".geq(100000)
.and($"iseffective".equalTo(1))
.and($"isbilling".equalTo(1))
.and($"iswin".equalTo(1))
.and($"adorderid".gt(200000))
.and($"adcreativeid".gt(200000)), floor($"winprice" / 1000)
) otherwise (0)
).as("dsp_pay_money"),
// DSP广告成本
sum(
when($"adplatformproviderid".geq(100000)
.and($"iseffective".equalTo(1))
.and($"isbilling".equalTo(1))
.and($"isbid".equalTo(1))
.and($"iswin".equalTo(1))
.and($"adorderid".gt(200000))
.and($"adcreativeid".gt(200000)), floor($"adpayment" / 1000)
) otherwise (0)
).as("dsp_cost_money")
)
// 第三步、过滤非0数据
.filter(
$"join_rtx_cnt".notEqual(0)
.and($"success_rtx_cnt".notEqual(0))
.and($"ad_show_cnt".notEqual(0))
.and($"ad_click_cnt".notEqual(0))
.and($"media_show_cnt".notEqual(0))
.and($"media_click_cnt".notEqual(0))
)
// 第四步、计算“三率”, 增加三列数据
.withColumn(
"success_rtx_rate", //
round($"success_rtx_cnt" / $"join_rtx_cnt", 2) // 保留两位有效数字
)
.withColumn(
"ad_click_rate", //
round($"ad_click_cnt" / $"ad_show_cnt", 2) // 保留两位有效数字
)
.withColumn(
"media_click_rate", //
round($"media_click_cnt" / $"media_show_cnt", 2) // 保留两位有效数字
)
// 第五步、增加报表的日期
.withColumn(
"report_date", // 报表日期字段
date_sub(current_date(), 1).cast(StringType)
)
//reportDF.printSchema()
//reportDF.show(20, truncate = false)
// iii. 返回结果数据
reportDF
}

主要使用groupBy、agg、filter和withColumn API实现报表分析,与前面SQL分析性能完全一致,原因在于SparkSQL中Catalyst引擎,无论是SQL还是DSL,最终生成物理计划都是一样的。

3.4 广告投放其他维度分布统计

广告投放统计,还可以依据【APP、设备、网络类型、网络运营及渠道】进行分组统计分析,获取报表数据,存储到MySQL表中。各个不同维度分组聚合统计,与前面的地域维度分组聚合统计的指标一致,仅仅是分组维度不一样而已,所以修改各个分组字段即可,具体说明如下:

1、APP维度:广告投放的APP分布

  • App应用ID:app_id、App应用名称:app_name

2、设备维度:广告投放的设备分布

  • 手机设备类型:client(1 android, 2 ios, 3 wp, 4 others)
  • 手机设备型号:device (手机的品牌)

3、网络类型维度:广告投放的网络类型分布

  • 网络类型ID:networkmannerid、网络类型名称:networkmannername
  • 0:WIFI、1:4G、2:3G、3:2G、4:OPERATOROTHER

4、网络运营商维度:广告投放的网络运营商分布

  • 网络运营商ID和名称:ispid, ispname

5、渠道维度:广告投放的渠道分布

  • 渠道ID:channelid

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

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

相关文章

JDBC学习(复习)-面试总结详细

JDBC详细介绍一、JDBC详细介绍二、jdbc面试总结2.1 JDBC操作数据库的步骤 &#xff1f;2.2 JDBC中的Statement 和PreparedStatement&#xff0c;CallableStatement的区别&#xff1f;2.3 JDBC中大数据量的分页解决方法?2.4 说说数据库连接池工作原理和实现方案&#xff1f;2.4…

九方财富冲刺上市:付费用户开始减少,退款金额飙升至4.9亿元

日前&#xff0c;九方财富控股有限公司&#xff08;下称“九方财富”&#xff09;通过港交所上市聆讯&#xff0c;并披露了聆讯后招股书。据贝多财经了解&#xff0c;九方财富最早于2021年8月31日在港交所递表&#xff0c;后在2022年3月、9月分别进行了更新。 据每日经济新闻报…

vue3.0 模板语法

文章目录前言&#xff1a;1. 内容渲染指令1.1 v-text1.2 {{ }}插值表达式1.3 v-html2. 双向绑定指令2.1 v-model2.2 v-model的修饰符3. 属性绑定指令3.1 动态绑定多个属性值3.2 绑定class和style属性4.条件渲染指令4.1 v-if、v-else-if、v-else4.2 v-show4.3 v-if与v-show的区别…

RebbitMQ 消息队列(简单使用)

消息队列介绍 MQ的优势 1.业务解耦&#xff1a;不同系统消费信息互不关联&#xff0c;灵活增减系统数量&#xff0c;修改某个系统其他系统也不影响 2.异步提速&#xff1a;不同系统之间可同时响应&#xff0c;提升并发量 3.削峰填谷&#xff1a;处理消息高峰期&#xff0c;均摊…

《图机器学习》-Graph Neural Network

前言 回顾之前的Node Embedding&#xff1a; 将图中的节点嵌入到d维空间&#xff0c;并确保图中相似的节点能够嵌在一起。 即学习一个编码器ENCENCENC确保图的节点嵌入到embedding space依然能够描述原空间节点之间的相似性。 在Node Embedding中&#xff0c;我们需要设计&…

DEXTUpload .NET增强的上传速度和可靠性

DEXTUpload .NET增强的上传速度和可靠性 DEXTUpload.NET Pro托管在Windows操作系统上的Internet Information Server(IIS)上&#xff0c;服务器端组件基于HTTP协议&#xff0c;支持从web浏览器到web服务器的文件上载。它也可以在ASP.NET服务器应用程序平台开发的任何网站上使用…

记一次攻防演练溯源实例

缘起 在今年的攻防期间&#xff0c;通过安全设备告警分析&#xff0c;需要对某个源攻击IP进行溯源反制&#xff0c;并且需要记录整个溯源过程和提交溯源报告。 开展溯源 研判 在溯源之前&#xff0c;首先应该判断是否真的存在攻击行为&#xff0c;攻击的特征&#xff0c;攻…

Linux学习(7.5)linux目录配置与重点回顾

鸟哥的 Linux 私房菜 -- Linux 的文件权限与目录配置 (vbird.org) 怎么记啊&#xff0c;直接点进去看吧 目录 Linux目录配置的依据--FHS 绝对路径与相对路径 重点回顾 以下内容转载自鸟哥的Linux私房菜 Linux目录配置的依据--FHS 是希望让使用者可以了解到已安装软件通常…

ARouter::Compiler The user has configuration the module name, it was

学习组件化使用的是阿里的ARouter&#xff0c;我是照着案例敲的&#xff0c;在编译的时候报了这么一个错。 我查了好多资料&#xff0c;大部分都是说build.gradle 配置出现了问题&#xff0c;比如没有配置 javaCompileOptions {annotationProcessorOptions {arguments [AROUTE…

shader(光栅化)

1.定义将模型经过mvp得到的标准立方体映射到屏幕。屏幕是像素数组组成&#xff0c;像素是一个颜色均匀的小方块。2.屏幕变换矩阵3.直接采样&#xff08;锯齿严重&#xff09;4.先模糊再采样&#xff08;抗锯齿有好转&#xff09;5.傅里叶变换6.高通滤波&#xff08;图像边界&am…

robot remote server用这个server去远程获取ip

server端配置&#xff1a; 1、安装python环境 2、下载robot remote server 下载地址&#xff1a;https://pypi.python.org/pypi/robotremoteserver/&#xff08;不要用pip下载&#xff0c;把robotremoteserver.py文件下载下来&#xff09; 3、首先创建一个目录E:\rfremote\ &a…

canvas初学2

一、碰撞检测 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width,…

Linux下java服务占用cpu过高如何处理

Linux下java服务占用cpu过高如何处理 top命令查看进程信息 top按下shiftp,按cpu使用率排行,可见进程1932占用最高,并且是一个java服务 使用jps命令确认java服务 [rootVM-16-16-centos ~]# jps 1011 Jps 9462 yuan_back-0.0.1-SNAPSHOT.jar 1932 spigot-1.18.jar查找异常进程中…

在windows11上安装openssh服务端并修改端口号

在windows11上安装openssh服务端并修改端口号 目录1.软件下载地址2.修改端口3.启动ssh原文链接&#xff1a;https://blog.csdn.net/qq_62129885/article/details/1268467751.软件下载地址 Release v9.2.0.0p1-Beta PowerShell/Win32-OpenSSH (github.com) https://github.co…

【BBuf的CUDA笔记】八,对比学习OneFlow 和 FasterTransformer 的 Softmax Cuda实现

0x1. OneFlow/FasterTransformer SoftMax CUDA Kernel 实现学习 这篇文章主要学习了oneflow的softmax kernel实现以及Faster Transformer softmax kernel的实现&#xff0c;并以个人的角度分别解析了原理和代码实现&#xff0c;最后对性能做一个对比方便大家直观的感受到onefl…

光伏行业规模“狂飙”至87.41GW,机器视觉检测成保量提质“王牌”?

在产业政策引导和市场需求驱动的双重作用下&#xff0c;我国光伏产业已成为具备国际竞争优势的产业&#xff0c;在制造规模、技术水平和市场份额等方面均位居全球前列。近日&#xff0c;国家能源局公布了2022年光伏新增装机规模&#xff1a;87.41GW&#xff0c;增长率59.27%。行…

一文带你了解MySQL的Server层和引擎层是如何交互的?

对于很多开发小伙伴来说&#xff0c;每天写SQL是必不可少的一项工作。 那不知道大家有没有深入了解过&#xff0c;当我们的一条SQL命令被执行时&#xff0c;MySQL是如何把数据从硬盘/内存中查出来并展示到用户面前的呢&#xff1f; 其实&#xff0c;MySQL也没有大家想象的那么…

DateTimeParseException

前端请求为字符串的时间格式2023-02-16 19:19:51&#xff0c;服务端用LocalDateTime类型接收时报解析异常java.time.format.DateTimeParseException: Text 2023-02-16 19:19:51 could not be parsed at index 10方法一&#xff1a;JsonFormat(shape Shape.STRING, pattern &q…

第四章.神经网络—BP神经网络

第四章.神经网络 4.3 BP神经网络 BP神经网络(误差反向传播算法)是整个人工神经网络体系中的精华&#xff0c;广泛应用于分类识别&#xff0c;逼近&#xff0c;回归&#xff0c;压缩等领域&#xff0c;在实际应用中&#xff0c;大约80%的神经网络模型都采用BP网络或BP网络的变化…

详解Ubuntu1804安装Anaconda(附网盘极速下载链接)

2022版的anaconda下载如下 百度网盘链接链接&#xff1a;https://pan.baidu.com/s/1RZICFpR_MYVxOxHzEbStRg 提取码&#xff1a;z864 下面是具体的安装过程 1、进入下载文件存放的位置打开终端运行.sh文件&#xff1a;&#xff08;我本人的下载位置就在“下载”里面&#x…