SparkSQL综合案例-省份维度的销售情况统计分析

一、项目背景

二、项目需求

        (1)需求

        ①各省销售指标,每个省份的销售额统计

        ②TOP3销售省份中,有多少家店铺日均销售额1000+

        ③TOP3省份中,各个省份的平均单价

        ④TOP3省份中,各个省份的支付类型比例

        (2)要求

        ①将需求结果写出到mysql

        ②将数据写入到Spark On Hive中

三、代码实现

        (1)需求1:
# cording:utf8
'''
要求1:各省销售额统计
要求2:TOP3销售省份中,有多少店铺达到过日销售额1000+
要求3:TOP3省份中,各省的平均单单价
要求4:TOP3省份中,各个省份的支付类型比例
'''from pyspark.sql import SparkSession
from pyspark.sql import functions as F
if __name__ == '__main__':spark = SparkSession.builder.appName('SQL_text').\master('local[*]').\config('spark.sql.shuffle.partitions', '2').\config('spark.sql.warehouse.dir', 'hdfs://pyspark01/user/hive/warehouse').\config('hive.metastore.uris', 'thrift://pyspark01:9083').\enableHiveSupport().\getOrCreate()# 1.读取数据# 省份信息,缺失值过滤,同时省份信息中会有‘null’字符串# 订单的金额,数据集中有订单的金额是单笔超过10000的,这些事测试数据# 列值过滤(SparkSQL会自动做这个优化)df = spark.read.format('json').load('../../input/mini.json').\dropna(thresh=1, subset=['storeProvince']).\filter("storeProvince != 'null'").\filter('receivable < 10000').\select('storeProvince', 'storeID', 'receivable', 'dateTS', 'payType')# TODO 1:各省销售额统计province_sale_df = df.groupBy('storeProvince').sum('receivable').\withColumnRenamed('sum(receivable)', 'money').\withColumn('money', F.round('money', 2)).\orderBy('money', ascending=False)province_sale_df.show(truncate=False)# 写出到Mysqlprovince_sale_df.write.mode('overwrite').\format('jdbc').\option('url', 'jdbc:mysql://pyspark01:3306/bigdata?useSSL=False&useUnicode=true&characterEncoding=utf8').\option('dbtable', 'province_sale').\option('user', 'root').\option('password', 'root').\option('encoding', 'utf8').\save()# 写出Hive表 saveAsTable 可以写出表 要求已经配置好spark on hive# 会将表写入到hive的数据仓库中province_sale_df.write.mode('overwrite').saveAsTable('default.province_sale', 'parquet')

        结果展示:

        MySQL数据展示:

        Hive数据展示:

        (2)需求2:
# cording:utf8
'''
要求1:各省销售额统计
要求2:TOP3销售省份中,有多少店铺达到过日销售额1000+
要求3:TOP3省份中,各省的平均单单价
要求4:TOP3省份中,各个省份的支付类型比例
'''from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.storagelevel import StorageLevelif __name__ == '__main__':spark = SparkSession.builder.appName('SQL_text').\master('local[*]').\config('spark.sql.shuffle.partitions', '2').\config('spark.sql.warehouse.dir', 'hdfs://pyspark01/user/hive/warehouse').\config('hive.metastore.uris', 'thrift://pyspark01:9083').\enableHiveSupport().\getOrCreate()# 1.读取数据# 省份信息,缺失值过滤,同时省份信息中会有‘null’字符串# 订单的金额,数据集中有订单的金额是单笔超过10000的,这些事测试数据# 列值过滤(SparkSQL会自动做这个优化)df = spark.read.format('json').load('../../input/mini.json').\dropna(thresh=1, subset=['storeProvince']).\filter("storeProvince != 'null'").\filter('receivable < 10000').\select('storeProvince', 'storeID', 'receivable', 'dateTS', 'payType')# TODO 1:各省销售额统计province_sale_df = df.groupBy('storeProvince').sum('receivable').\withColumnRenamed('sum(receivable)', 'money').\withColumn('money', F.round('money', 2)).\orderBy('money', ascending=False)# # 写出到Mysql# province_sale_df.write.mode('overwrite').\#     format('jdbc').\#     option('url', 'jdbc:mysql://pyspark01:3306/bigdata?useSSL=False&useUnicode=true&characterEncoding=utf8').\#     option('dbtable', 'province_sale').\#     option('user', 'root').\#     option('password', 'root').\#     option('encoding', 'utf8').\#     save()## # 写出Hive表 saveAsTable 可以写出表 要求已经配置好spark on hive# # 会将表写入到hive的数据仓库中# province_sale_df.write.mode('overwrite').saveAsTable('default.province_sale', 'parquet')# TODO 需求2:TOP3销售省份中,有多少店铺达到过日销售额1000+# 2.1 找到TOP3的销售省份top3_province_df = province_sale_df.limit(3).select('storeProvince').\withColumnRenamed('storeProvince', 'top3_province')     # 对列名进行重命名,防止与province_sale_df的storeProvince冲突# 2.2 和原始的DF进行内关联,数据关联后,得到TOP3省份的销售数据top3_province_df_joined = df.join(top3_province_df, on=df['storeProvince'] == top3_province_df['top3_province'])# 因为需要多次使用到TOP3省份数据,所有对其进行持久化缓存top3_province_df_joined.persist(StorageLevel.MEMORY_AND_DISK)# from_unixtime将秒级的日期数据转换为年月日数据# from_unixtime的精度是秒级,数据的精度是毫秒级,需要对数据进行进度的裁剪province_hot_store_count_df = top3_province_df_joined.groupBy("storeProvince", "storeID",F.from_unixtime(df['dateTS'].substr(0, 10), "yyyy-mm-dd").alias('day')).\sum('receivable').withColumnRenamed('sum(receivable)', 'money').\filter('money > 1000 ').\dropDuplicates(subset=['storeID']).\groupBy('storeProvince').count()province_hot_store_count_df.show()# 写出到Mysqlprovince_sale_df.write.mode('overwrite'). \format('jdbc'). \option('url', 'jdbc:mysql://pyspark01:3306/bigdata?useSSL=False&useUnicode=true&characterEncoding=utf8'). \option('dbtable', 'province_hot_store_count'). \option('user', 'root'). \option('password', 'root'). \option('encoding', 'utf8'). \save()# 写出Hive表 saveAsTable 可以写出表 要求已经配置好spark on hive# 会将表写入到hive的数据仓库中province_sale_df.write.mode('overwrite').saveAsTable('default.province_hot_store_count', 'parquet')top3_province_df_joined.unpersist()

        结果展示:

        MySQL结果展示:

        Hive结果展示:

        (3)需求3:
# cording:utf8
'''
要求1:各省销售额统计
要求2:TOP3销售省份中,有多少店铺达到过日销售额1000+
要求3:TOP3省份中,各省的平均单单价
要求4:TOP3省份中,各个省份的支付类型比例
'''from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.storagelevel import StorageLevelif __name__ == '__main__':spark = SparkSession.builder.appName('SQL_text').\master('local[*]').\config('spark.sql.shuffle.partitions', '2').\config('spark.sql.warehouse.dir', 'hdfs://pyspark01/user/hive/warehouse').\config('hive.metastore.uris', 'thrift://pyspark01:9083').\enableHiveSupport().\getOrCreate()# 1.读取数据# 省份信息,缺失值过滤,同时省份信息中会有‘null’字符串# 订单的金额,数据集中有订单的金额是单笔超过10000的,这些事测试数据# 列值过滤(SparkSQL会自动做这个优化)df = spark.read.format('json').load('../../input/mini.json').\dropna(thresh=1, subset=['storeProvince']).\filter("storeProvince != 'null'").\filter('receivable < 10000').\select('storeProvince', 'storeID', 'receivable', 'dateTS', 'payType')# TODO 1:各省销售额统计province_sale_df = df.groupBy('storeProvince').sum('receivable').\withColumnRenamed('sum(receivable)', 'money').\withColumn('money', F.round('money', 2)).\orderBy('money', ascending=False)# # 写出到Mysql# province_sale_df.write.mode('overwrite').\#     format('jdbc').\#     option('url', 'jdbc:mysql://pyspark01:3306/bigdata?useSSL=False&useUnicode=true&characterEncoding=utf8').\#     option('dbtable', 'province_sale').\#     option('user', 'root').\#     option('password', 'root').\#     option('encoding', 'utf8').\#     save()## # 写出Hive表 saveAsTable 可以写出表 要求已经配置好spark on hive# # 会将表写入到hive的数据仓库中# province_sale_df.write.mode('overwrite').saveAsTable('default.province_sale', 'parquet')# TODO 需求2:TOP3销售省份中,有多少店铺达到过日销售额1000+# 2.1 找到TOP3的销售省份top3_province_df = province_sale_df.limit(3).select('storeProvince').\withColumnRenamed('storeProvince', 'top3_province')     # 对列名进行重命名,防止与province_sale_df的storeProvince冲突# 2.2 和原始的DF进行内关联,数据关联后,得到TOP3省份的销售数据top3_province_df_joined = df.join(top3_province_df, on=df['storeProvince'] == top3_province_df['top3_province'])# 因为需要多次使用到TOP3省份数据,所有对其进行持久化缓存top3_province_df_joined.persist(StorageLevel.MEMORY_AND_DISK)# from_unixtime将秒级的日期数据转换为年月日数据# from_unixtime的精度是秒级,数据的精度是毫秒级,需要对数据进行进度的裁剪province_hot_store_count_df = top3_province_df_joined.groupBy("storeProvince", "storeID",F.from_unixtime(df['dateTS'].substr(0, 10), "yyyy-mm-dd").alias('day')).\sum('receivable').withColumnRenamed('sum(receivable)', 'money').\filter('money > 1000 ').\dropDuplicates(subset=['storeID']).\groupBy('storeProvince').count()province_hot_store_count_df.show()# # 写出到Mysql# province_hot_store_count_df.write.mode('overwrite'). \#     format('jdbc'). \#     option('url', 'jdbc:mysql://pyspark01:3306/bigdata?useSSL=False&useUnicode=true&characterEncoding=utf8'). \#     option('dbtable', 'province_hot_store_count'). \#     option('user', 'root'). \#     option('password', 'root'). \#     option('encoding', 'utf8'). \#     save()## # 写出Hive表 saveAsTable 可以写出表 要求已经配置好spark on hive# # 会将表写入到hive的数据仓库中# province_hot_store_count_df.write.mode('overwrite').saveAsTable('default.province_hot_store_count', 'parquet')# TODO 3:TOP3省份中,各省的平均单单价top3_province_order_avg_df = top3_province_df_joined.groupBy("storeProvince").\avg("receivable").\withColumnRenamed("avg(receivable)", "money").\withColumn("money", F.round("money", 2)).\orderBy("money", ascending=False)top3_province_order_avg_df.show(truncate=False)# 写出到Mysqltop3_province_order_avg_df.write.mode('overwrite'). \format('jdbc'). \option('url', 'jdbc:mysql://pyspark01:3306/bigdata?useSSL=False&useUnicode=true&characterEncoding=utf8'). \option('dbtable', 'top3_province_order_avg'). \option('user', 'root'). \option('password', 'root'). \option('encoding', 'utf8'). \save()# 写出Hive表 saveAsTable 可以写出表 要求已经配置好spark on hive# 会将表写入到hive的数据仓库中top3_province_order_avg_df.write.mode('overwrite').saveAsTable('default.top3_province_order_avg', 'parquet')top3_province_df_joined.unpersist()

        结果展示

        MySQL与Hive结果展示:

        (4)需求4:
# cording:utf8
'''
要求1:各省销售额统计
要求2:TOP3销售省份中,有多少店铺达到过日销售额1000+
要求3:TOP3省份中,各省的平均单单价
要求4:TOP3省份中,各个省份的支付类型比例
'''from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.storagelevel import StorageLevel
from pyspark.sql.types import StringType
if __name__ == '__main__':spark = SparkSession.builder.appName('SQL_text').\master('local[*]').\config('spark.sql.shuffle.partitions', '2').\config('spark.sql.warehouse.dir', 'hdfs://pyspark01/user/hive/warehouse').\config('hive.metastore.uris', 'thrift://pyspark01:9083').\enableHiveSupport().\getOrCreate()# 1.读取数据# 省份信息,缺失值过滤,同时省份信息中会有‘null’字符串# 订单的金额,数据集中有订单的金额是单笔超过10000的,这些事测试数据# 列值过滤(SparkSQL会自动做这个优化)df = spark.read.format('json').load('../../input/mini.json').\dropna(thresh=1, subset=['storeProvince']).\filter("storeProvince != 'null'").\filter('receivable < 10000').\select('storeProvince', 'storeID', 'receivable', 'dateTS', 'payType')# TODO 1:各省销售额统计province_sale_df = df.groupBy('storeProvince').sum('receivable').\withColumnRenamed('sum(receivable)', 'money').\withColumn('money', F.round('money', 2)).\orderBy('money', ascending=False)# # 写出到Mysql# province_sale_df.write.mode('overwrite').\#     format('jdbc').\#     option('url', 'jdbc:mysql://pyspark01:3306/bigdata?useSSL=False&useUnicode=true&characterEncoding=utf8').\#     option('dbtable', 'province_sale').\#     option('user', 'root').\#     option('password', 'root').\#     option('encoding', 'utf8').\#     save()## # 写出Hive表 saveAsTable 可以写出表 要求已经配置好spark on hive# # 会将表写入到hive的数据仓库中# province_sale_df.write.mode('overwrite').saveAsTable('default.province_sale', 'parquet')# TODO 需求2:TOP3销售省份中,有多少店铺达到过日销售额1000+# 2.1 找到TOP3的销售省份top3_province_df = province_sale_df.limit(3).select('storeProvince').\withColumnRenamed('storeProvince', 'top3_province')     # 对列名进行重命名,防止与province_sale_df的storeProvince冲突# 2.2 和原始的DF进行内关联,数据关联后,得到TOP3省份的销售数据top3_province_df_joined = df.join(top3_province_df, on=df['storeProvince'] == top3_province_df['top3_province'])# 因为需要多次使用到TOP3省份数据,所有对其进行持久化缓存top3_province_df_joined.persist(StorageLevel.MEMORY_AND_DISK)# from_unixtime将秒级的日期数据转换为年月日数据# from_unixtime的精度是秒级,数据的精度是毫秒级,需要对数据进行进度的裁剪province_hot_store_count_df = top3_province_df_joined.groupBy("storeProvince", "storeID",F.from_unixtime(df['dateTS'].substr(0, 10), "yyyy-mm-dd").alias('day')).\sum('receivable').withColumnRenamed('sum(receivable)', 'money').\filter('money > 1000 ').\dropDuplicates(subset=['storeID']).\groupBy('storeProvince').count()province_hot_store_count_df.show()# # 写出到Mysql# province_hot_store_count_df.write.mode('overwrite'). \#     format('jdbc'). \#     option('url', 'jdbc:mysql://pyspark01:3306/bigdata?useSSL=False&useUnicode=true&characterEncoding=utf8'). \#     option('dbtable', 'province_hot_store_count'). \#     option('user', 'root'). \#     option('password', 'root'). \#     option('encoding', 'utf8'). \#     save()## # 写出Hive表 saveAsTable 可以写出表 要求已经配置好spark on hive# # 会将表写入到hive的数据仓库中# province_hot_store_count_df.write.mode('overwrite').saveAsTable('default.province_hot_store_count', 'parquet')# TODO 3:TOP3省份中,各省的平均单单价top3_province_order_avg_df = top3_province_df_joined.groupBy("storeProvince").\avg("receivable").\withColumnRenamed("avg(receivable)", "money").\withColumn("money", F.round("money", 2)).\orderBy("money", ascending=False)top3_province_order_avg_df.show(truncate=False)# # 写出到Mysql# top3_province_order_avg_df.write.mode('overwrite'). \#     format('jdbc'). \#     option('url', 'jdbc:mysql://pyspark01:3306/bigdata?useSSL=False&useUnicode=true&characterEncoding=utf8'). \#     option('dbtable', 'top3_province_order_avg'). \#     option('user', 'root'). \#     option('password', 'root'). \#     option('encoding', 'utf8'). \#     save()## # 写出Hive表 saveAsTable 可以写出表 要求已经配置好spark on hive# # 会将表写入到hive的数据仓库中# top3_province_order_avg_df.write.mode('overwrite').saveAsTable('default.top3_province_order_avg', 'parquet')# TODO 4:TOP3省份中,各个省份的支付类型比例top3_province_df_joined.createTempView("province_pay")# 自定义UDFdef udf_func(percent):return str(round(percent * 100)) + "%"# 注册UDFmy_udf = F.udf(udf_func, StringType())pay_type_df = spark.sql('''SELECT storeProvince, payType, (count(payType) / total) AS percent FROM (SELECT storeProvince, payType, count(1) OVER(PARTITION BY storeProvince) AS total FROM province_pay) AS subGROUP BY storeProvince, payType, total''').withColumn('percent', my_udf("percent"))pay_type_df.show()# 写出到Mysqlpay_type_df.write.mode('overwrite'). \format('jdbc'). \option('url', 'jdbc:mysql://pyspark01:3306/bigdata?useSSL=False&useUnicode=true&characterEncoding=utf8'). \option('dbtable', 'pay_type'). \option('user', 'root'). \option('password', 'root'). \option('encoding', 'utf8'). \save()# 写出Hive表 saveAsTable 可以写出表 要求已经配置好spark on hive# 会将表写入到hive的数据仓库中top3_province_order_avg_df.write.mode('overwrite').saveAsTable('default.pay_type', 'parquet')top3_province_df_joined.unpersist()

       结果展示:

       MySQL结果展示:

        Hive结果展示:

四、项目运行问题及解决方法

        报错:java.sql.BatchUpdateException: Incorrect string value: '\xE6\xB1\x9F\xE8\xA5\xBF...' for column 'storeProvince' atrow1

        原因:MySQL的UTF-8只支持3个字节的unicode字符,无法支持四个字节的Unicode字符

        解决办法:在MySQL控制台执行下列代码修改编码格式

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win11 安装wsl遇到的问题解决

Win11 安装wsl遇到的问题解决 Win11 安装wsl遇到的问题解决WslRegisterDistribution failed:0x8007019eWslRegisterDistribution failed:0x800701bcUbuntu换源WSL通过网络访问Windows Win11 安装wsl遇到的问题解决 WslRegisterDistribution failed:0x8007019e 参考Link WslR…

Uni-app智慧工地可视化信息平台源码

智慧工地的核心是数字化&#xff0c;它通过传感器、监控设备、智能终端等技术手段&#xff0c;实现对工地各个环节的实时数据采集和传输&#xff0c;如环境温度、湿度、噪音等数据信息&#xff0c;将数据汇集到云端进行处理和分析&#xff0c;生成各种报表、图表和预警信息&…

技术栈 业务架构 插件库

大前端 技术栈 业务架构 插件库

k8s中kubectl陈述式资源管理

目录 1、 理论 1.1、 管理k8s核心资源的三种基本方法 &#xff1a; 1.1.1陈述式的资源管理方法&#xff1a; 1.1.1.1、优点&#xff1a; 1.1.1.2、缺点&#xff1a; 1.1.2、声明式资源管理方法 1.1.3、GUI式资源管理方法 1.2、陈述式资源管理方法 2. 对资源的增、删、…

Lvs+Nginx+NDS

什么是&#xff1f;为什么&#xff1f;需要负载均衡 一个网站在创建初期&#xff0c;一般来说都是只有一台服务器对用户提供服务 ​ 从图里可以看出&#xff0c;用户经过互联网直接连接了后端服务器&#xff0c;如果这台服务器什么时候突然 GG 了&#xff0c;用户将无法访问这…

网络(番外篇)can网络知识

通常ECU发出的网络管理报文ID Base Address Node ID Mifa项目向外发的网络管理报文0x418&#xff0c;就是DBC根据基地址加上节点ID定义的。 报文属性是 NmAsrMessage即应答网络报文。 DBC里关于整个网络管理的参数定义&#xff0c;确定好后导入达芬奇&#xff0c;就是直接…

AT32固件库外设使用,ArduinoAPI接口移植,模块化

目录 一、ArduinoAPI移植一、通用定时器使用1.计时1.2.ETR外部时钟计数4.ArduinoAPI - timer 三、ADC1.ADC初始化&#xff08;非DMA&#xff09;2.ADC_DMA 规则通道扫描 六、USB HID IAP1.准备好Bootloader和app2.配置好时钟&#xff0c;一定要打开USB3.将生成的时钟配置复制到…

Flink on yarn 加载失败plugins失效问题解决

Flink on yarn 加载失败plugins失效问题解决 flink版本&#xff1a;1.13.6 1. 问题 flink 任务运行在yarn集群,plugins加载失效,导致通过扩展资源获取任务参数失效 2. 问题定位 yarn容器的jar包及插件信息,jar包是正常上传 源码定位 加载plugins入口&#xff0c;TaskMana…

薛定谔的猫重出江湖?法国初创公司AliceBob研发猫态量子比特

总部位于巴黎的初创公司Alice&Bob使用超导芯片的两个相反的量子态&#xff08;他们称之为“猫态量子比特”芯片&#xff09;来帮助开发量子计算的不同自旋方式。&#xff08;图片来源&#xff1a;网络&#xff09; 有的人认为&#xff0c;构建量子计算机的模块模仿了著名的…

kubeadmin部署k8s1.27.4

kubeadmin部署k8s1.27.4 环境介绍 IP主机名资源配置系统版本192.168.117.170k8s-master2c2g200gCentos7.9192.168.117.171k8s-node12c2g200gCentos7.9192.168.117.172k8s-node22c2g200gCentos7.9 编辑本地解析且修改主机名 三台主机都要做 vim /etc/hosts配置主机名 mast…

现代挖掘机vr在线互动展示厅是实现业务增长的加速度

VR数字博物馆全景展示充分应用5G、VR全景、web3d开发和三维动画等技术&#xff0c;将实体博物馆整体还原到3D数字空间&#xff0c;让游客360全景漫游式参观&#xff0c;无论大小、贵重、破损的典藏展品都能通过3D建模技术&#xff0c;逼真重现到三维虚拟场景中&#xff0c;让参…

MQTT协议和边缘计算

1.基本概念 MQTT是基于TCP/IP协议栈构建的异步通信消息协议&#xff0c;是一种轻量级的发布、订阅信息传输协议。可以在不可靠的网络环境中进行扩展&#xff0c;适用于设备硬件存储空间或网络带宽有限的场景。使用MQTT协议&#xff0c;消息发送者与接收者不受时间和空间的限制…

电商时代,VR全景如何解决实体店难做没流量?

近日&#xff0c;电商和实体经济的对立成为了热门话题&#xff0c;尽管电商的兴起确实对线下实体店造成了一定的冲击&#xff0c;但实体店也不是没有办法挽救。VR全景助力线下实体店打造线上店铺&#xff0c;打通流量全域布局&#xff0c;还能实现打开产品、查看产品内部细节等…

自己动手搭建一个传奇是什么体验?下面是我搭建的详细教程,大家跟着教程做,不光是学会了技术,平时还可以帮朋友搭建

传奇游戏是一代人的回忆&#xff0c;它曾经风靡一时&#xff0c;让无数玩家沉迷其中。这款游戏以其独特的玩法、丰富的故事背景和深刻的角色刻画&#xff0c;吸引了一大批忠实粉丝。 在传奇游戏中&#xff0c;玩家可以体验到各种不同的职业和角色&#xff0c;每个角色都有自己…

Unity之ShaderGraph如何实现水波纹效果

前言 今天我们来实现一个水波纹的效果 如下图所示: 主要节点 Normalize :返回输入 In 的标准化值。输出矢量与输入 In 具有相同的方向,但长度为 1。 Length:返回输入 In 的长度。这也称为大小 (magnitude)。矢量的长度是使用毕达哥拉斯定理 (Pythagorean Theorum) 计算…

C# 基于腾讯云人脸核身和百度云证件识别技术相结合的 API 实现

目录 腾讯云人脸核身技术 Craneoffice.net 采用的识别方式 1、活体人脸核身(权威库)&#xff1a; 2、活体人脸比对&#xff1a; 3、照片人脸核身(权威库)&#xff1a; 调用成本 百度云身份证识别 调用成本 相关结合点 核心代码 实现调用人脸核身API的示例 实现调用身…

系统架构设计师之使用McCabe方法可以计算程序流程图的环形复杂度

系统架构设计师之使用McCabe方法可以计算程序流程图的环形复杂度

【C++】多态 ③ ( “ 多态 “ 实现需要满足的三个条件 | “ 多态 “ 的应用场景 | “ 多态 “ 的思想 | “ 多态 “ 代码示例 )

文章目录 一、" 多态 " 实现条件1、" 多态 " 实现需要满足的三个条件2、" 多态 " 的应用场景3、" 多态 " 的思想 二、" 多态 " 代码示例 一、" 多态 " 实现条件 1、" 多态 " 实现需要满足的三个条件 &q…

【深蓝学院】手写VIO第8章--相机与IMU时间戳同步--笔记

0. 内容 1. 时间戳同步问题及意义 时间戳同步的原因&#xff1a;如果不同步&#xff0c;由于IMU频率高&#xff0c;可能由于时间戳不同步而导致在两帧camera之间的时间内用多了或者用少了IMU的数据&#xff0c;且时间不同步会导致我们首尾camera和IMU数据时间不同&#xff0c;…

java基础 特殊文件

1.Properties属性文件&#xff1a; 1.1使用Properties读取属性文件里的键值对数据&#xff1a; package specialFile;import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.Enumeration; import java.util.Propert…