Python大数据之PySpark(六)RDD的操作

news2024/12/23 18:40:34

文章目录

    • RDD的操作
      • 函数分类
      • Transformation函数
      • Action函数
      • 基础练习[Wordcount快速演示]
      • Transformer算子
  • -*- coding: utf-8 -*-
  • Program function:完成单Value类型RDD的转换算子的演示
  • 1-创建SparkContext申请资源
  • 2-key和value类型算子
  • groupByKey
  • [('b', <pyspark.resultiterable.ResultIterable object at 0x7f001c469c40>),
  • ('c', <pyspark.resultiterable.ResultIterable object at 0x7f001c469310>),
  • ('a', <pyspark.resultiterable.ResultIterable object at 0x7f001c469a00>)]
  • reduceByKey
  • sortByKey
  • countByKey
      • Action算子
  • -*- coding: utf-8 -*-
  • Program function:完成单Value类型RDD的转换算子的演示
  • 1-创建SparkContext申请资源
  • 2-foreach-Applies a function to all elements of this RDD.
  • def f(x):print(x)
  • 3-foreachPartition--Applies a function to each partition of this RDD.
  • 从性能角度分析,按照分区并行比元素更加高效
  • 4-map---按照元素进行转换
  • 5-mapPartiton-----按照分区进行转换
  • Return a new RDD by applying a function to each partition of this RDD.
      • 重要函数
  • TODO: 1-创建SparkContext申请资源
  • TODO: 2-基础数据处理
  • [(a:[1,1]),(b,[1,1])]
  • 使用自定义集聚合函数组合每个键的元素的通用功能。
  • - `createCombiner`, which turns a V into a C (e.g., creates a one-element list)
  • 对初始值进行操作
  • - `mergeValue`, to merge a V into a C (e.g., adds it to the end ofa list)
  • 对分区内的元素进行合并
  • - `mergeCombiners`, to combine two C's into a single one (e.g., merges the lists)
  • 对分区间的元素进行合并
  • -*- coding: utf-8 -*-
  • Program function:完成单Value类型RDD的转换算子的演示
  • TODO: 1-创建SparkContext申请资源
  • TODO: 2-基础数据处理
  • 这里需要实现需求:求解一个学生的平均成绩
  • 第一个分区("Fred", 88), ("Fred", 95)
  • 第二个分区("Fred", 91), ("Wilma", 93),
  • 第三个分区("Wilma", 95), ("Wilma", 98)
  • reduceByKey
  • 如何求解平均成绩?
  • 使用自定义集聚合函数组合每个键的元素的通用功能。
  • - `createCombiner`, which turns a V into a C (e.g., creates a one-element list)
  • 对初始值进行操作
  • - `mergeValue`, to merge a V into a C (e.g., adds it to the end ofa list)
  • 对分区内的元素进行合并
  • - `mergeCombiners`, to combine two C's into a single one (e.g., merges the lists)
  • 对分区间的元素进行合并
  • 接下来平均值如何实现--('Fred', [274, 3])---x[0]=Fred x[1]= [274, 3],x[1][0]=274,x[1][1]=3
    • 后记

RDD的操作

函数分类

  • *Transformation操作只是建立计算关系,而Action 操作才是实际的执行者*
  • image-20210911110434999
  • Transformation算子
  • 转换算子
  • 操作之间不算的转换,如果想看到结果通过action算子触发
  • image-20210911110807249
  • Action算子
  • 行动算子
  • 触发Job的执行,能够看到结果信息
  • image-20210911110850559

Transformation函数

  • 值类型valueType

  • map

  • flatMap

  • filter

  • mapValue

双值类型DoubleValueType

  • intersection
  • union
  • difference
  • distinct

Key-Value值类型

  • reduceByKey
  • groupByKey
  • sortByKey
  • combineByKey是底层API
  • foldBykey
  • aggreateBykey

Action函数

  • collect
  • saveAsTextFile
  • first
  • take
  • takeSample
  • top

基础练习[Wordcount快速演示]

Transformer算子

  • 单value类型代码


# -*- coding: utf-8 -*-

# Program function:完成单Value类型RDD的转换算子的演示

from pyspark import SparkConf,SparkContext
import re
'''
分区内:一个rdd可以分为很多分区,每个分区里面都是有大量元素,每个分区都需要线程执行
分区间:有一些操作分区间做一些累加
'''
if __name__ == '__main__':

# 1-创建SparkContext申请资源

conf = SparkConf().setAppName("mini").setMaster("local[*]")
sc = SparkContext.getOrCreate(conf=conf)
sc.setLogLevel("WARN")#一般在工作中不这么写,直接复制log4j文件

# 2-map操作

rdd1 = sc.parallelize([1, 2, 3, 4, 5, 6])
rdd__map = rdd1.map(lambda x: x * 2)
print(rdd__map.glom().collect())#[2, 4, 6, 8, 10, 12],#[[2, 4, 6], [8, 10, 12]]

# 3-filter操作

print(rdd1.glom().collect())
print(rdd1.filter(lambda x: x > 3).glom().collect())

# 4-flatMap

rdd2 = sc.parallelize(["  hello      you", "hello me  "])
print(rdd2.flatMap(lambda word: re.split("\s+", word.strip())).collect())

# 5-groupBY

x = sc.parallelize([1, 2, 3])
y = x.groupBy(lambda x: 'A' if (x % 2 == 1) else 'B')
print(y.mapValues(list).collect())#[('A', [1, 3]), ('B', [2])]

# 6-mapValue

x1 = sc.parallelize([("a", ["apple", "banana", "lemon"]), ("b", ["grapes"])])
def f(x): return len(x)
print(x1.mapValues(f).collect())







  • 双value类型的代码

  • 
    







# -*- coding: utf-8 -*-

# Program function:完成单Value类型RDD的转换算子的演示

from pyspark import SparkConf, SparkContext
import re

'''
分区内:一个rdd可以分为很多分区,每个分区里面都是有大量元素,每个分区都需要线程执行
分区间:有一些操作分区间做一些累加
'''
if __name__ == '__main__':

# 1-创建SparkContext申请资源

conf = SparkConf().setAppName("mini2").setMaster("local[*]")
sc = SparkContext.getOrCreate(conf=conf)
sc.setLogLevel("WARN")  # 一般在工作中不这么写,直接复制log4j文件

# 2-对两个RDD求并集

rdd1 = sc.parallelize([1, 2, 3, 4, 5])
rdd2 = sc.parallelize([1, 2, 3, 4, 5, 6, 7, 8])
Union_RDD = rdd1.union(rdd2)
print(Union_RDD.collect())
print(rdd1.intersection(rdd2).collect())
print(rdd2.subtract(rdd1).collect())

# Return a new RDD containing the distinct elements in this RDD.

print(Union_RDD.distinct().collect())
print(Union_RDD.distinct().glom().collect())

  • key-Value算子

  • 
    



-- coding: utf-8 --

Program function:完成单Value类型RDD的转换算子的演示

from pyspark import SparkConf, SparkContext
import re

‘’’
分区内:一个rdd可以分为很多分区,每个分区里面都是有大量元素,每个分区都需要线程执行
分区间:有一些操作分区间做一些累加
‘’’
if name == ‘main’:

1-创建SparkContext申请资源

conf = SparkConf().setAppName(“mini2”).setMaster(“local[*]”)
sc = SparkContext.getOrCreate(conf=conf)
sc.setLogLevel(“WARN”) # 一般在工作中不这么写,直接复制log4j文件

2-key和value类型算子

groupByKey

rdd1 = sc.parallelize([(“a”, 1), (“b”, 2)])
rdd2 = sc.parallelize([(“c”, 1), (“b”, 3)])
rdd3 = rdd1.union(rdd2)
key1 = rdd3.groupByKey()
print(“groupByKey:”,key1.collect())
#groupByKey:

[(‘b’, <pyspark.resultiterable.ResultIterable object at 0x7f001c469c40>),

(‘c’, <pyspark.resultiterable.ResultIterable object at 0x7f001c469310>),

(‘a’, <pyspark.resultiterable.ResultIterable object at 0x7f001c469a00>)]

print(key1.mapValues(list).collect())#需要通过mapValue获取groupByKey的值
print(key1.mapValues(tuple).collect())

reduceByKey

key2 = rdd3.reduceByKey(lambda x, y: x + y)
print(key2.collect())

sortByKey

print(key2.map(lambda x: (x[1], x[0])).sortByKey(False).collect())#[(5, ‘b’), (1, ‘c’), (1, ‘a’)]

countByKey

print(rdd3.countByValue())#defaultdict(<class ‘int’>, {(‘a’, 1): 1, (‘b’, 2): 1, (‘c’, 1): 1, (‘b’, 3): 1})

* 


Action算子

  • 部分操作

  • 
    







# -*- coding: utf-8 -*-

# Program function:完成单Value类型RDD的转换算子的演示

from pyspark import SparkConf, SparkContext
import re

'''
分区内:一个rdd可以分为很多分区,每个分区里面都是有大量元素,每个分区都需要线程执行
分区间:有一些操作分区间做一些累加
'''
if __name__ == '__main__':

# 1-创建SparkContext申请资源

conf = SparkConf().setAppName("mini2").setMaster("local[*]")
sc = SparkContext.getOrCreate(conf=conf)
sc.setLogLevel("WARN")  # 一般在工作中不这么写,直接复制log4j文件

# 2-key和value类型算子

# groupByKey

rdd1 = sc.parallelize([("a", 1), ("b", 2)])
rdd2 = sc.parallelize([("c", 1), ("b", 3)])

print(rdd1.first())
print(rdd1.take(2))
print(rdd1.top(2))
print(rdd1.collect())

rdd3 = sc.parallelize([1, 2, 3, 4, 5])
from operator import add
from operator import mul

print(rdd3.reduce(add))
print(rdd3.reduce(mul))

rdd4 = sc.parallelize(range(0, 10))

# 能否保证每次抽样结果是一致的,使用seed随机数种子

print(rdd4.takeSample(True, 3, 123))
print(rdd4.takeSample(True, 3, 123))
print(rdd4.takeSample(True, 3, 123))
print(rdd4.takeSample(True, 3, 34))

  • 其他补充算子

  • 
    



-- coding: utf-8 --

Program function:完成单Value类型RDD的转换算子的演示

from pyspark import SparkConf, SparkContext
import re

‘’’
分区内:一个rdd可以分为很多分区,每个分区里面都是有大量元素,每个分区都需要线程执行
分区间:有一些操作分区间做一些累加
‘’’

def f(iterator): # 【1,2,3】 【4,5】
for x in iterator: # for x in 【1,2,3】 x=1,2,3 print 1.2.3
print(x)

def f1(iterator): # 【1,2,3】 【4,5】 sum(1+2+3) sum(4+5)
yield sum(iterator)

if name == ‘main’:

1-创建SparkContext申请资源

conf = SparkConf().setAppName(“mini2”).setMaster(“local[*]”)
sc = SparkContext.getOrCreate(conf=conf)
sc.setLogLevel(“WARN”) # 一般在工作中不这么写,直接复制log4j文件

2-foreach-Applies a function to all elements of this RDD.

rdd1 = sc.parallelize([(“a”, 1), (“b”, 2)])
print(rdd1.glom().collect())

def f(x):print(x)

rdd1.foreach(lambda x: print(x))

3-foreachPartition–Applies a function to each partition of this RDD.

从性能角度分析,按照分区并行比元素更加高效

rdd1.foreachPartition(f)

4-map—按照元素进行转换

rdd2 = sc.parallelize([1, 2, 3, 4])
print(rdd2.map(lambda x: x * 2).collect())

5-mapPartiton-----按照分区进行转换

Return a new RDD by applying a function to each partition of this RDD.

print(rdd2.mapPartitions(f1).collect()) # [3, 7]

* 


重要函数

  • image-20210911145341185

基本函数

  • 基础的transformation
  • 和action操作

分区操作函数

  • mapPartition
  • foreachPartition

重分区函数

  • 
    







# -*- coding: utf-8 -*-

# Program function:完成单Value类型RDD的转换算子的演示

from pyspark import SparkConf, SparkContext
import re
'''
分区内:一个rdd可以分为很多分区,每个分区里面都是有大量元素,每个分区都需要线程执行
分区间:有一些操作分区间做一些累加
alt+6 可以调出来所有TODO,
TODO是Python提供了预留功能的地方
'''
if __name__ == '__main__':
#TODO:  1-创建SparkContext申请资源
conf = SparkConf().setAppName("mini2").setMaster("local[*]")
sc = SparkContext.getOrCreate(conf=conf)
sc.setLogLevel("WARN")  # 一般在工作中不这么写,直接复制log4j文件
#TODO:   2-执行重分区函数--repartition
rdd1 = sc.parallelize([1, 2, 3, 4, 5, 6], 3)
print("partitions num:",rdd1.getNumPartitions())
print(rdd1.glom().collect())#[[1, 2], [3, 4], [5, 6]]
print("repartition result:")
#TODO:   repartition可以增加分区也可以减少分区,但是都会产生shuflle,如果减少分区的化建议使用coalesc避免发生shuffle
rdd__repartition1 = rdd1.repartition(5)
print("increase partition",rdd__repartition1.glom().collect())#[[], [1, 2], [5, 6], [3, 4], []]
rdd__repartition2 = rdd1.repartition(2)
print("decrease partition",rdd__repartition2.glom().collect())#decrease partition [[1, 2, 5, 6], [3, 4]]
#TODO:   3-减少分区--coalese
print(rdd1.coalesce(2).glom().collect())#[[1, 2], [3, 4, 5, 6]]
print(rdd1.coalesce(5).glom().collect())#[[1, 2], [3, 4], [5, 6]]
print(rdd1.coalesce(5,True).glom().collect())#[[], [1, 2], [5, 6], [3, 4], []]

# 结论:repartition默认调用的是coalese的shuffle为True的方法

# TODO:  4-PartitonBy,可以调整分区,还可以调整分区器(一种hash分区器(一般打散数据),一种range分区器(排序拍好的))

# 此类专门针对RDD中数据类型为KeyValue对提供函数

# rdd五大特性中有第四个特点key-value分区器,默认是hashpartitioner分区器

rdd__map = rdd1.map(lambda x: (x, x))
print("partitions length:",rdd__map.getNumPartitions())#partitions length: 3
print(rdd__map.partitionBy(2).glom().collect())

聚合函数



  • image-20210911152557498
  • 代码:

  • 
    





# -*- coding: utf-8 -*-

# Program function:完成单Value类型RDD的转换算子的演示

from pyspark import SparkConf, SparkContext
import re

'''
分区内:一个rdd可以分为很多分区,每个分区里面都是有大量元素,每个分区都需要线程执行
分区间:有一些操作分区间做一些累加
alt+6 可以调出来所有TODO,
TODO是Python提供了预留功能的地方
'''
def addNum(x,y):
return x+y
if __name__ == '__main__':

# TODO:  1-创建SparkContext申请资源

conf = SparkConf().setAppName("mini2").setMaster("local[*]")
sc = SparkContext.getOrCreate(conf=conf)
sc.setLogLevel("WARN")  # 一般在工作中不这么写,直接复制log4j文件

# TODO:   2-使用reduce进行聚合计算

rdd1 = sc.parallelize([1, 2, 3, 4, 5, 6], 3)
from operator import add

# 直接得到返回值-21

print(rdd1.reduce(add))

# TODO: 3-使用fold进行聚合计算

# 第一个参数zeroValue是初始值,会参与分区的计算

# 第二个参数是执行运算的operation

print(rdd1.fold(0, add))  # 21
print(rdd1.getNumPartitions())  # 3
print(rdd1.glom().collect())
print("fold result:", rdd1.fold(10, add))

# TODO: 3-使用aggreate进行聚合计算

# seqOp分区内的操作, combOp分区间的操作

print(rdd1.aggregate(0, add, add))  # 21
print(rdd1.glom().collect())
print("aggregate result:", rdd1.aggregate(1, add, add))  # aggregate result: 25

# 结论:fold是aggregate的简化版本,fold分区内和分区间的函数是一致的

print("aggregate result:", rdd1.aggregate(1, addNum, addNum))  # aggregate result: 25

  • byKey类的聚合函数

  • groupByKey----如何获取value的数据?------答案:result.mapValue(list).collect

  • reduceByKey

  • foldBykey

  • image-20210911160802926

  • aggregateByKey

  • CombineByKey:这是一个更为底层实现的bykey 聚合算子,可以实现更多复杂功能

  • image-20210911180750943

  • 案例1:

  • 
    


# -*- coding: utf-8 -*-
# Program function:完成单Value类型RDD的转换算子的演示
from pyspark import SparkConf, SparkContext
import re

'''
分区内:一个rdd可以分为很多分区,每个分区里面都是有大量元素,每个分区都需要线程执行
分区间:有一些操作分区间做一些累加
alt+6 可以调出来所有TODO,
TODO是Python提供了预留功能的地方
'''

'''
对初始值进行操作
'''
def createCombiner(value): #('a',[1])
return [value]

# 这里的x=createCombiner得到的[value]结果
def mergeValue(x,y): #这里相同a的value=y=1
x.append(y)#('a', [1, 1]),('b', [1])
return x

def mergeCombiners(a,b):
a.extend(b)
return a

if name == ‘main’:

TODO: 1-创建SparkContext申请资源

conf = SparkConf().setAppName(“mini2”).setMaster(“local[*]”)
sc = SparkContext.getOrCreate(conf=conf)
sc.setLogLevel(“WARN”) # 一般在工作中不这么写,直接复制log4j文件

TODO: 2-基础数据处理

from operator import add

rdd = sc.parallelize([(“a”, 1), (“b”, 1), (“a”, 1)])

[(a:[1,1]),(b,[1,1])]

print(sorted(rdd.groupByKey().mapValues(list).collect()))

使用自定义集聚合函数组合每个键的元素的通用功能。

- createCombiner, which turns a V into a C (e.g., creates a one-element list)

对初始值进行操作

- mergeValue, to merge a V into a C (e.g., adds it to the end ofa list)

对分区内的元素进行合并

- mergeCombiners, to combine two C’s into a single one (e.g., merges the lists)

对分区间的元素进行合并

by_key_result = rdd.combineByKey(createCombiner, mergeValue, mergeCombiners)
print(sorted(by_key_result.collect()))#[(‘a’, [1, 1]), (‘b’, [1])]

* 案例2

* ```python
 


-- coding: utf-8 --

Program function:完成单Value类型RDD的转换算子的演示

from pyspark import SparkConf, SparkContext
import re

‘’’
分区内:一个rdd可以分为很多分区,每个分区里面都是有大量元素,每个分区都需要线程执行
分区间:有一些操作分区间做一些累加
alt+6 可以调出来所有TODO,
TODO是Python提供了预留功能的地方
‘’’

‘’’
对初始值进行操作
[value,1],value指的是当前学生成绩,1代表的是未来算一下一个学生考了几次考试
(“Fred”, 88)---------->[88,1]
‘’’

def createCombiner(value): #
return [value, 1]

‘’’
x代表的是 [value,1]值,x=[88,1]
y代表的相同key的value,比如(“Fred”, 95)的95,执行分区内的累加
‘’’

def mergeValue(x, y):
return [x[0] + y, x[1] + 1]

‘’’
a = a[0] value,a[1] 几次考试
‘’’

def mergeCombiners(a, b):
return [a[0] + b[0], a[1] + b[1]]

if name == ‘main’:

TODO: 1-创建SparkContext申请资源

conf = SparkConf().setAppName(“mini2”).setMaster(“local[*]”)
sc = SparkContext.getOrCreate(conf=conf)
sc.setLogLevel(“WARN”) # 一般在工作中不这么写,直接复制log4j文件

TODO: 2-基础数据处理

from operator import add

这里需要实现需求:求解一个学生的平均成绩

x = sc.parallelize([(“Fred”, 88), (“Fred”, 95), (“Fred”, 91), (“Wilma”, 93), (“Wilma”, 95), (“Wilma”, 98)], 3)
print(x.glom().collect())

第一个分区(“Fred”, 88), (“Fred”, 95)

第二个分区(“Fred”, 91), (“Wilma”, 93),

第三个分区(“Wilma”, 95), (“Wilma”, 98)

reduceByKey

reduce_by_key_rdd = x.reduceByKey(lambda x, y: x + y)
print(“reduceBykey:”, reduce_by_key_rdd.collect()) # [(‘Fred’, 274), (‘Wilma’, 286)]

如何求解平均成绩?

使用自定义集聚合函数组合每个键的元素的通用功能。

- createCombiner, which turns a V into a C (e.g., creates a one-element list)

对初始值进行操作

- mergeValue, to merge a V into a C (e.g., adds it to the end ofa list)

对分区内的元素进行合并

- mergeCombiners, to combine two C’s into a single one (e.g., merges the lists)

对分区间的元素进行合并

combine_by_key_rdd = x.combineByKey(createCombiner, mergeValue, mergeCombiners)
print(combine_by_key_rdd.collect()) # [(‘Fred’, [274, 3]), (‘Wilma’, [286, 3])]

接下来平均值如何实现–(‘Fred’, [274, 3])—x[0]=Fred x[1]= [274, 3],x[1][0]=274,x[1][1]=3

print(combine_by_key_rdd.map(lambda x: (x[0], int(x[1][0] / x[1][1]))).collect())

* 

* 面试题:


  • image-20210911160023982
  • 关联函数

后记

📢博客主页:https://manor.blog.csdn.net

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由 Maynor 原创,首发于 CSDN博客🙉
📢感觉这辈子,最深情绵长的注视,都给了手机⭐
📢专栏持续更新,欢迎订阅:https://blog.csdn.net/xianyu120/category_12453356.html

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

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

相关文章

【Java】微服务——Gateway网关

目录 1.为什么需要网关2.gateway快速入门1&#xff09;创建gateway服务&#xff0c;引入依赖2&#xff09;编写启动类3&#xff09;编写基础配置和路由规则4&#xff09;重启测试5&#xff09;网关路由的流程图 3.3.断言工厂3.4.过滤器工厂3.4.1.路由过滤器的种类3.4.2.请求头过…

idea插件(free mybatis plugin)

安装&#xff1a; 由于我用的idea版本是2023的&#xff0c;所以搜出来的是Free MyBatis Tool,和Free MyBatis plugin是一样的 主要功能&#xff1a; 生成mapper xml文件 快速从代码跳转到mapper及从mapper返回代码 mybatis自动补全及语法错误提示 集成mybatis generator gui…

Java高级之反射

关于反射的举例&#xff1a; 示例代码&#xff1a;Fan.java package testFanShe;/*** author: Arbicoral* Description: 测试反射&#xff1a;* 成员变量&#xff1a;2个public&#xff0c;2个private* 构造器&#xff1a;4个public&#x…

HTML 笔记 表格

1 表格基本语法 tr&#xff1a;table row th&#xff1a;table head 2 表格属性 2.1 基本属性 表格的基本属性是指表格的行、列和单元格但并不是每个表格的单元格大小都是统一的&#xff0c;所以需要设计者通过一些属性参数来修改表格的样子&#xff0c;让它们可以更更多样…

yolov5 web端部署进行图片和视频检测

目录 1、思路 2、代码结构 3、代码运行 4、api接口代码 5、web ui界面 6、参考资料 7、代码分享 1、思路 通过搭建flask微型服务器后端&#xff0c;以后通过vue搭建网页前端。flask是第一个第三方库。与其他模块一样&#xff0c;安装时可以直接使用python的pip命令实现…

防火墙-——iptables

目录 安全技术&#xff1a;&#xff08;市场上常见的防御&#xff09; 1.入侵检测机制 2.入侵防御 3.防火墙 4.防水墙 通信的五大要素和四要素 iptables 四个表 数据流程图 安装iptables iptables管理选项: 匹配条件 通用匹配规则 1.查看filter中的 INPUT表 2.清…

性能测试笔记

一、性能测试的概念 性能测试的概念 使用自动化工具&#xff0c;模拟不同的场景&#xff0c;对软件各项性能指标进行测试和评估的过程 性能测试的目的 评估当前系统能力&#xff0c;出现性能bug后&#xff0c;优化性能&#xff1a;预测未来的性能需求是否满足 例如&#xf…

Sketch for mac v98.3(ui设计矢量绘图)

Sketch是一款为用户提供设计和创建数字界面的矢量编辑工具。它主要用于UI/UX设计师、产品经理和开发人员&#xff0c;帮助他们快速设计和原型各种应用程序和网站。 Sketch具有简洁直观的界面&#xff0c;以及丰富的功能集&#xff0c;使得用户可以轻松地创建、编辑和共享精美的…

javaWeb网上购物系统的设计与实现

摘 要 随着计算机网络技术的飞速发展和人们生活节奏的不断加快&#xff0c;电子商务技术已经逐渐融入了人们的日常生活当中&#xff0c;网上商城作为电子商务最普遍的一种形式&#xff0c;已被大众逐渐接受。因此开发一个网上商城系统&#xff0c;适合当今形势&#xff0c;更加…

Unity中Shader的光照模型Lambert

文章目录 前言一、Lambert光照模型1、公式可以使用图形计算器来看出这个点积对于结果的影响 前言 Unity中Shader的光照模型Lambert 一、Lambert光照模型 1、公式 A&#xff1a;可以理解为环境光的颜色 K&#xff1a;反射系数 LC&#xff1a;主要的入射光的颜色 N&#xff1a;…

模拟滤波器的基础知识和设计

信号处理工作中滤波器的应用是非常广泛的&#xff0c;可以分成模拟滤波器和数字滤波器两种&#xff0c;数字滤波器主要包括两种&#xff0c;IIR和FIR&#xff0c;这两种滤波器后面统一说&#xff0c;今天先来说一说模拟滤波器&#xff08;主要是我先用Python实现了Matlab书里面…

风储VSG-基于虚拟同步发电机的风储并网系统Simulink仿真

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

阻塞、非阻塞、异步、同步

IO | bRPC 一般有三种操作IO的方式&#xff1a; blocking IO: 发起IO操作后阻塞当前线程直到IO结束&#xff0c;标准的同步IO&#xff0c;如默认行为的posix read和write。non-blocking IO: 发起IO操作后不阻塞&#xff0c;用户可阻塞等待多个IO操作同时结束。non-blocking也…

【Java 进阶篇】HTML列表标签详解与示例

HTML&#xff08;Hypertext Markup Language&#xff09;是网页开发中的标准标记语言&#xff0c;用于构建网页内容。在网页中&#xff0c;常常需要展示信息的列表&#xff0c;例如商品列表、文章目录、任务清单等。HTML提供了多种列表标签&#xff0c;用于创建不同类型的列表。…

Python3操作文件系列(二):文件数据读写|二进制数据读写

Python3操作文件系列(一):判断文件|目录是否存在三种方式 Python3操作文件系列(二):文件数据读写|二进制数据读写 Python3数据文件读取与写入 一: 文件数据|二进制数据读写 import os"""Python3的open(file,mode"文件的操作模式")利用该函数可以对…

TensorFlow入门(九、张量及操作函数介绍)

在TensorFlow程序中,所有的数据都由tensor数据结构来代表。即使在计算图中,操作间传递的数据也是Tensor tensor在TensorFlow中并不是直接采用数组的形式,它只是对TensorFlow中计算结果的引用。也就是说在张量中并没有真正保存数字,它保存的是如何得到这些数字的计算过程 一个…

【轻松玩转MacOS】常用软件篇

引言 在本篇文章中&#xff0c;我将介绍如何安装和使用一些常用的软件&#xff0c;如Safari浏览器、邮件、日历、地图等。让我们一起来看看吧&#xff01; 一、Safari浏览器 Safari是MacOS自带的浏览器&#xff0c;具有简洁、快速、安全的特点。 以下是一些Safari浏览器的使…

蛋仔派对如何获得蛋币,蛋仔派对怎么切换账号

在蛋仔派对游戏中&#xff0c;蛋币是一种虚拟货币&#xff0c;用以购买游戏道具或提升游戏体验。以下是五种可能的获得蛋币的方式&#xff1a; 关注【娱乐天梯】&#xff0c;获取内部福利号 1. 完成挑战和任务&#xff1a;玩家可以通过完成不同类型的任务和挑战来获取蛋币。任务…

根据前序与中序遍历结果构造二叉树

文章前言&#xff1a;如果不知道什么是前序与中序的小白同学&#xff0c;作者推荐&#xff1a;二叉树的初步认识_加瓦不加班的博客-CSDN博客 思路&#xff1a; 先通过前序遍历结果定位根节点 再结合中序遍历结果切分左右子树 public class E09Leetcode105 {//1. pre-order 前…

练[BJDCTF2020]The mystery of ip

[BJDCTF2020]The mystery of ip 文章目录 [BJDCTF2020]The mystery of ip掌握知识解题思路关键paylaodsmarty可利用paylaod 掌握知识 ​ ssti里的php语言smarty模板注入 解题思路 访问题目链接&#xff0c;发现导航条的flag和hint两个吸引人的题目&#xff0c;先查看flag发现…