当前位置: 首页 > news >正文

sparkRDD教程之基本命令

作者:nchu可乐百香果

指导者:nchu-YoungDragon

1.前期准备

(1)从迅雷网盘上面下载这个项目,并且把scala,maven和java环境配置好

网盘链接:

分享文件:SparkRDD.zip
链接:https://pan.xunlei.com/s/VOGUwt7hVp1ZQB6V7n1j6e70A1?pwd=q87r#
复制这段内容后打开迅雷,查看更方便

打开项目后,其目录结构如下:

(2)新建一个scala object文件 (点击新建scala文件后选择第三个选项object)

固定模版

.appName("task5"),这个名字建议改为自己当前的文件名
package com.itheimaimport org.apache.spark.sql.SparkSessionobject task5 {def main(args: Array[String]): Unit = {// 创建SparkSessionval spark = SparkSession.builder.appName("task5").master("local").getOrCreate()val sc = spark.sparkContext//在这里写代码spark.stop()}}

2.sparkRDD的基本命令

x._1表示元组的第一项(从1开始数这里,反正这样的写法是从1开始数的)

当然,x(0)是从0开始数的

(1)创建sparkRDD和打印输出

第一种方式
    val rdd1=sc.parallelize(List(1,2,3,4))println(rdd1.collect().mkString("\n"))

 结果

第二种方式
    val rdd2=sc.makeRDD(List(1,2,3,4))println(rdd2.collect().mkString("\n"))

 结果

第三种方式
    var score_path="src\\main\\resources\\score.txt"val rdd3=sc.textFile(score_path)println(rdd3.collect().mkString("\n"))

score.txt

student_id,course_code,score
108,3-105,99
105,3-105,88
107,3-105,77
105,3-245,87
108,3-245,89
107,3-245,82
106,3-245,74
107,6-101,75
108,6-101,82
106,6-101,65
109,6-102,99
101,6-102,79
105,9-106,81
106,9-106,97
107,9-106,65
108,9-106,100
109,9-106,82
105,6-102,85

(2)map命令

代码1 

    var rdd1=sc.parallelize(List(1,2,3,4))var res1=rdd1.map(x=>x*x*x)println(res1.collect().mkString("\n"))

结果 1

代码2

    var rdd2=sc.parallelize(List("a","b","c"))var res2=rdd2.map(x=>(x,1))println(res2.collect().mkString("\n"))

结果2

(3)flatmap命令(这个用起来有一些限制,所以使用的很少,我感觉不太好用,不如map简单直接)

代码 1

    val rdd2 = sc.parallelize(List("a b c", "d e f", "g h i"))val map_res = rdd2.map(x => x.split(" "))println(map_res.collect().mkString("\n"))val flatMap_res = rdd2.flatMap(x => x.split(" "))println(flatMap_res.collect().mkString("\n"))

结果1 

(4)sortBy命令(默认值是true,表示升序排序)

代码1

    val rdd = sc.parallelize(List('a','b','c','d','e'))val res = rdd.map(x =>(x,1)).sortBy(x=>x._1, true)//true可以省略println(res.collect().mkString("\n"))

截图1

代码2

    val rdd = sc.parallelize(List('a','b','c','d','e'))val res = rdd.map(x =>(x,1)).sortBy(x=>x._1, false)println(res.collect().mkString("\n"))

截图2

代码3

    val rdd = sc.parallelize(1 to 10)val res = rdd.map(x =>(x,1)).sortBy(x=>x._1, false)println(res.collect().mkString("\n"))

截图3

(5)filter命令(满足条件的留下来,和sql中的where命令类似)

代码1

    val rdd = sc.parallelize(1 to 10)val res = rdd.filter(x=>x<=5)println(res.collect().mkString("\n"))

截图1

代码2

    val rdd = sc.parallelize(1 to 10)val res = rdd.filter(x=>x>=3 && x<=5)println(res.collect().mkString("\n"))

截图2

(6)distinct命令(去重)

代码1

    val rdd = sc.parallelize(List(1,2,2,3,3))val res = rdd.distinct()println(res.collect().mkString("\n"))

截图1

(7)union命令(类似于求并集,但是不会自动去重)

代码1

    val rdd1 = sc.parallelize(List(1,2,3,4))val rdd2 = sc.parallelize(List(3,4,5,6))val res = rdd1.union(rdd2)println(res.collect().mkString("\n"))

截图1

(8)intersection(类似于求交集)

代码1

    val rdd1 = sc.parallelize(List(1,2,3,4))val rdd2 = sc.parallelize(List(3,4,5,6))val res = rdd1.intersection(rdd2)println(res.collect().mkString("\n"))

截图1

(9)subtract(类似于求差集)

代码1

    val rdd1 = sc.parallelize(List(1,2,3,4))val rdd2 = sc.parallelize(List(3,4,5,6))val res1_2 = rdd1.subtract(rdd2)println(res1_2.collect().mkString("\n"))

截图1

代码2

    val rdd1 = sc.parallelize(List(1,2,3,4))val rdd2 = sc.parallelize(List(3,4,5,6))val res2_1 = rdd2.subtract(rdd1)println(res2_1.collect().mkString("\n"))

截图2

(10)cartesion(求笛卡尔积)

代码1

    val rdd1 = sc.parallelize(List(1,2,3,4))val rdd2 = sc.parallelize(List(3,4,5,6))val res = rdd1.cartesian(rdd2)println(res.collect().mkString("\n"))

截图1

(11)keyBy命令

代码1-3的前期准备,初始化rdd

val rdd = sc.parallelize(List('a','b','c','d','e'))

代码1

    val res1 = rdd.map(x => (1, 2, x)).keyBy(x => x._1)println(res1.collect().mkString("\n"))

截图1

代码2

    val res2 = rdd.map(x => (1, 2, x)).keyBy(x => x._2)println(res2.collect().mkString("\n"))

截图2

代码3

    val res3 = rdd.map(x => (1, 2, x)).keyBy(x => x._3)println(res3.collect().mkString("\n"))

截图3

总结

    val rdd = sc.parallelize(List('a', 'b', 'c', 'd', 'e'))val res1 = rdd.map(x => (1, 2, x)).keyBy(x => x._1)val res11 = rdd.map(x => (1, 2, x)).map(x=>(x._1,x)) //这2行代码等价println(res1.collect().mkString("\n"))println(res11.collect().mkString("\n"))

(12)mapValues(对所有值进行相同的操作,同时要求是二元组结构)

代码1

    val rdd = sc.parallelize(List('a', 'b', 'c', 'd', 'e'))val rdd2=rdd.map(x=>(x,1))println(rdd2.collect().mkString("\n"))

截图1  (显然此时它们的value都为1)

代码2

    val rdd = sc.parallelize(List('a', 'b', 'c', 'd', 'e'))val rdd2=rdd.map(x=>(x,1)).mapValues(x=>x*20)println(rdd2.collect().mkString("\n"))

截图2

(13)reduceByKey(对相同键的值进行操作,同时要求是二元组结构)

代码1

    val rdd = sc.parallelize(List('a', 'b', 'c', 'd', 'e'))val rdd2=rdd.map(x=>(x,1)).mapValues(x=>x*20)var rdd4=rdd2.union(rdd2).union(rdd2)println(rdd4.collect().mkString("\n"))

截图1

代码2

    val rdd = sc.parallelize(List('a', 'b', 'c', 'd', 'e'))val rdd2=rdd.map(x=>(x,1)).mapValues(x=>x*20)var rdd4=rdd2.union(rdd2).union(rdd2)var rdd5=rdd4.reduceByKey((y1,y2)=>(y1+y2))println(rdd5.collect().mkString("\n"))

截图2

(14)groupBy命令(我感觉使用的不多,了解即可)

代码1

    val rdd = sc.parallelize(0 to 9)val rdd2=rdd.groupBy(x=>{if( x % 2==0) "even" else "odd" })println(rdd2.collect().mkString("\n"))

截图1

(15)groupByKey命令(我感觉使用的不多,了解即可)

代码1

    val rdd = sc.parallelize(List(('a',1),('b',2),('c',3)))val rdd1 = sc.parallelize(List(('a',4),('b',5),('c',6)))val rdd2=rdd.union(rdd1)println(rdd2.collect().mkString("\n"))

截图1

代码2

    val rdd = sc.parallelize(List(('a',1),('b',2),('c',3)))val rdd1 = sc.parallelize(List(('a',4),('b',5),('c',6)))val rdd2=rdd.union(rdd1).groupByKey()println(rdd2.collect().mkString("\n"))

截图2

(16)join命令

代码1

    val rdd1 = sc.parallelize(List(("K1", "V1"), ("K2", "V2"), ("K3", "V3")))val rdd2 = sc.parallelize(List(("K1", "V2"), ("K2", "V3"), ("K4", "V4")))var join1 = rdd1.join(rdd2)println(join1.collect().mkString("\n"))

截图1

代码2  (利用其他方法来实现和join类似的效果)

    val rdd1 = sc.parallelize(List(("K1", "V1"), ("K2", "V2"), ("K3", "V3")))val rdd2 = sc.parallelize(List(("K1", "V2"), ("K2", "V3"), ("K4", "V4")))var res2 = rdd1.union(rdd2).mapValues(x => (x, "V")).reduceByKey((y1, y2) => (y1._1, y2._1)).filter(x => x._2._2 != "V").sortBy(x => x._1)println(res2.collect().mkString("\n"))

截图2

(17)zip命令

代码1

    var rdd3=sc.makeRDD(1 to 5)var rdd4=sc.makeRDD(List('a','b','c','d','e'))var res3_4=rdd3.zip(rdd4)println(res3_4.collect().mkString("\n"))

截图1

代码2

    var rdd3 = sc.makeRDD(1 to 5)var rdd4 = sc.makeRDD(List('a', 'b', 'c', 'd', 'e'))var res4_3=rdd4.zip(rdd3)println(res4_3.collect().mkString("\n"))

截图2

(18)其他命令

3.总结一下

(1)第一点,也是重点

x._1表示元组的第一项(从1开始数这里,反正这样的写法是从1开始数的)

当然,x(0)是从0开始数的

count命令的返回值long类型,这一点要注意,经常需要使用toInt来转Int

(2)join命令的等价替换

这个其实主要还是为了方便自己更好理解这些命令

求点赞求收藏求关注

作者:nchu可乐百香果

指导者:nchu-YoungDragon

4.其他

(1)代码注释

package com.itheima

// 导入SparkSession和SaveMode等相关库
import org.apache.spark.sql.{SparkSession, SaveMode}

object task1 {
  def main(args: Array[String]): Unit = {
    // 创建SparkSession对象,这个对象是操作Spark的入口
    val spark = SparkSession
      .builder
      .appName("WordCount")  // 设置应用程序名称
      .master("local")  // 设置运行模式为local,即在本地运行,可以通过集群模式连接远程集群
//      .master("spark://192.168.88.101:7077")  // 这行代码可以用于连接到远程Spark集群,当前是注释掉的
      .getOrCreate()  // 获取SparkSession对象,如果没有则创建

    // 获取SparkContext对象,SparkContext是Spark应用的核心,用来创建RDD
    val sc = spark.sparkContext

    // 读取HDFS上的两个文本文件并创建RDD
    val rdd1 = sc.textFile("hdfs://node1:8020/input/A.txt")  // 读取A.txt文件
    val rdd2 = sc.textFile("hdfs://node1:8020/input/B.txt")  // 读取B.txt文件

//    // 本地文件读取方式(注释掉)
//    val rdd1 = sc.textFile("D:\\新建文件夹 (3)\\2024大三上学期文件夹\\黑马Redis笔记\\SparkRDD\\src\\main\\java\\com\\springbootdemo\\A.txt")
//    val rdd2 = sc.textFile("D:\\新建文件夹 (3)\\2024大三上学期文件夹\\黑马Redis笔记\\SparkRDD\\src\\main\\java\\com\\springbootdemo\\B.txt")

    // 合并两个RDD,并进行处理:
    // 1. 使用union合并两个RDD
    // 2. 使用map将每行文本按空格分割,取第一个和第二个元素作为元组
    // 3. 使用sortBy按元组的第一个元素排序
    // 4. 使用distinct去重
    val rdd3 = rdd1.union(rdd2).map(x => (x.split(" ")(0), x.split(" ")(1))).sortBy(_._1).distinct()

    // 将RDD转换为DataFrame,DataFrame是SparkSQL中用于表示结构化数据的核心数据结构
    val data = spark.createDataFrame(rdd3).toDF("value1", "value2")  // 设置DataFrame的列名为value1和value2

    // 配置数据库连接参数,假设目标数据库为MySQL
    // 设置数据库的连接URL,包含主机地址和端口号
    // val jdbcUrl = "jdbc:mysql://192.168.88.101:3306/spark"  // 使用远程MySQL服务器的URL(注释掉)
    val jdbcUrl = "jdbc:mysql://127.0.0.1:3306/spark"  // 使用本地MySQL服务器的URL
    val jdbcUser = "root"  // 数据库的用户名
    val jdbcPassword = "123456"  // 数据库的密码

    // 将DataFrame写入MySQL数据库
    data.write
      .format("jdbc")  // 使用JDBC格式进行数据写入
      .option("url", jdbcUrl)  // 配置JDBC连接URL
      .option("dbtable", "spark_task1")  // 指定目标数据库表名
      .option("user", jdbcUser)  // 配置数据库用户名
      .option("password", jdbcPassword)  // 配置数据库密码
      .mode(SaveMode.Overwrite)  // 写入模式设置为覆盖(Overwrite),会覆盖已有数据
      .save()  // 执行保存操作

    // 停止SparkSession,释放资源
    spark.stop()
  }
}

代码流程简述:

  1. 创建SparkSession:初始化Spark的核心环境,允许你使用SparkSQL等高级API。
  2. 读取数据:从HDFS或本地文件系统读取两个文本文件,创建RDD。
  3. 数据转换:对读取的RDD进行转换,进行数据的合并、分割、排序和去重操作。
  4. 转换为DataFrame:将RDD转换为DataFrame以便使用SQL等功能。
  5. 数据库配置:设置MySQL数据库连接的URL、用户名和密码。
  6. 将数据写入数据库:将处理后的DataFrame写入到指定的MySQL表中。
  7. 关闭SparkSession:释放资源,结束Spark应用。

(2)什么是SparkSession

`SparkSession` 是 Spark 2.0 引入的一个统一入口点,它简化了与 Spark 相关的所有操作,包括批处理、流处理、机器学习和图计算等。

在 Spark 1.x 中,用户使用 `SQLContext` 和 `HiveContext` 等不同的上下文来操作 Spark SQL 数据库或者使用 RDD API,而 `SparkSession` 将这些功能整合在一起,成为一个统一的入口,使得用户不需要区分具体的上下文。

### 主要功能和作用:

1. **创建 DataFrame 和 DataSet**:
   `SparkSession` 允许用户通过 `read` 接口创建 DataFrame 或者 DataSet,支持多种数据源如:CSV、JSON、Parquet、JDBC、HDFS 等。
   
2. **访问 Spark SQL**:
   通过 `SparkSession` 可以直接执行 SQL 查询,执行结果以 DataFrame 形式返回。

3. **Spark 应用的入口点**:
   `SparkSession` 提供了访问 `SparkContext`、`SQLContext`、`HiveContext` 等功能,因此它是操作 Spark 集群的主入口。

4. **管理 Spark 配置**:
   `SparkSession` 允许用户设置 Spark 配置参数,控制 Spark 作业的行为,比如内存大小、执行模式等。

5. **集成 Hive**:
   在 Spark 2.0 中,`SparkSession` 也提供了对 Hive 的支持,使得 Spark 可以无缝集成到 Hive 环境中,支持执行 HiveQL 查询。

### 创建 `SparkSession` 的基本步骤:
1. **初始化 SparkSession**:
   使用 `SparkSession.builder()` 创建一个 SparkSession 实例,并配置应用名称、运行模式等。

   ```scala
   val spark = SparkSession
     .builder()
     .appName("Example Application")
     .master("local[*]")  // 运行模式(local表示在本地运行,*表示使用所有CPU核心)
     .getOrCreate()  // 获取或创建 SparkSession
   ```

2. **通过 SparkSession 执行 SQL 操作**:
   ```scala
   val df = spark.read.json("path_to_json_file")
   df.createOrReplaceTempView("table_name")  // 创建临时视图
   val result = spark.sql("SELECT * FROM table_name")  // 执行SQL查询
   result.show()
   ```

3. **通过 SparkSession 访问 SparkContext**:
   `SparkSession` 提供了对 `SparkContext` 的访问,可以通过 `spark.sparkContext` 获取。
   ```scala
   val sc = spark.sparkContext  // 获取 SparkContext
   ```

### SparkSession 的重要属性和方法:
- `spark.read`:用于读取数据(如 CSV、JSON、Parquet 等)。
- `spark.sql()`:用于执行 SQL 查询。
- `spark.catalog`:用于管理表、视图等元数据。
- `spark.udf`:用于注册用户自定义函数(UDF)。
- `spark.version`:用于获取 Spark 版本。

### 示例:
```scala
val spark = SparkSession.builder()
  .appName("Spark Session Example")
  .master("local")
  .getOrCreate()

// 使用 SparkSession 读取数据
val df = spark.read.csv("path/to/data.csv")

// 执行 SQL 查询
df.createOrReplaceTempView("my_table")
val result = spark.sql("SELECT * FROM my_table WHERE column1 > 100")
result.show()

// 停止 SparkSession
spark.stop()
```

通过 `SparkSession`,Spark 提供了一个统一的接口来执行不同类型的操作,简化了 Spark 程序的编写和执行过程。

相关文章:

sparkRDD教程之基本命令

作者&#xff1a;nchu可乐百香果 指导者&#xff1a;nchu-YoungDragon 1.前期准备 &#xff08;1&#xff09;从迅雷网盘上面下载这个项目&#xff0c;并且把scala&#xff0c;maven和java环境配置好 网盘链接&#xff1a; 分享文件&#xff1a;SparkRDD.zip 链接&#xf…...

【JavaScript】比较运算符的运用、定义函数、if(){}...esle{} 语句

比较运算符 !><> < 自定义函数&#xff1a; function 函数名&#xff08;&#xff09;{ } 判断语句&#xff1a; if(判断){ }else if(判断){ 。。。。。。 }else{ } 代码示例&#xff1a; <!DOCTYPE html> <html> <head><meta charset&quo…...

ShardingSphere—SQL 路由与执行解析原理

在分布式数据库中&#xff0c;SQL 路由、解析及执行是核心机制&#xff0c;用于高效处理 SQL 请求并将其分发到合适的数据节点。在 ShardingSphere 中&#xff0c;这一过程分为三个主要阶段&#xff1a;SQL 路由、SQL 解析 和 SQL 执行&#xff0c;通过灵活的策略和优化机制实现…...

机器学习——什么是代价函数?

1.代价函数的定义 首先,提到代价函数是估计值和实际值的差,这应该是指预测值和真实值之间的差异,用来衡量模型的好坏。 在一元线性模型中,模型是直线,有两个参数,可能是斜率和截距。 通过调整这两个参数,让代价函数最小,这应该是说我们要找到最佳的斜率和截距,使得预测…...

k8s集群换IP

k8s集群搭建及节点加入时需要确定IP&#xff0c;但安装完成后设备移动到新环境可能出现网段更换或者IP被占用的情况&#xff0c;导致无法ping通节点或者无法打开原IP的服务。 解决方法为保持原有IP不更换&#xff0c;给网卡再加一个IP 这边使用两个ubuntu虚拟机模拟服务器和w…...

RPC 源码解析~Apache Dubbo

解析 RPC&#xff08;远程过程调用&#xff09;的源码可以帮助你深入理解其工作原理和实现细节。为了更好地进行源码解析&#xff0c;我们选择一个流行的 RPC 框架——Apache Dubbo 作为示例。Dubbo 是一个高性能、轻量级的开源 Java RPC 框架&#xff0c;广泛应用于企业级应用…...

【认识油管头部频道】ep5 “5-Minute Crafts”——DIY 和生活技巧

5-Minute Crafts 是一个非常受欢迎的 DIY 和生活技巧频道&#xff0c;它的火爆有多方面的原因&#xff1a; 1. 简单实用的内容 视频主要以解决日常生活中遇到的小问题为主&#xff0c;提供简单易学的技巧&#xff0c;吸引了想快速获取实用知识的观众。 2. 短视频形式 每个视…...

vue3 uniapp封装一个瀑布流组件

新增组件m-waterfall 这样就可以在页面直接使用 不用在引入了 <template><view class"m-waterfall"><view id"m-left-column" class"m-column"><slot name"left" :leftList"leftList"></slot&…...

基于Java的语音陪聊软件——支持聊天私聊-礼物系统-直播系统-缘分匹配-游戏陪玩

丰富的经验、成熟的技术&#xff0c;打造适合当下市场发展的语音交友软件源码。Java 语言凭借其独特的优势&#xff0c;为这款语音陪聊软件的稳健运行和持续发展奠定了坚实基础。它不仅融合了聊天私聊、礼物系统和直播系统等实用且有趣的功能&#xff0c;还创新性地引入了缘分匹…...

山石防火墙命令行配置示例

现网1台山石SG6000防火墙&#xff0c;配置都可以通过GUI实现。 但有一些配置在命令行下配置效率更高&#xff0c;比如在1个已有策略中添加1个host或端口。 下面的双引号可以不加 1 创建服务 1.1 单个端口 service "tcp-901"tcp dst-port 901 1.2 端口范围 servi…...

WordPress内容保护策略:如何反击并利用被盗内容

当你的网站开始获得大量流量时&#xff0c;内容盗窃成为不可避免的问题。除了通过高级的保护措施防止内容被盗&#xff0c;你还可以采取一些策略来反击内容盗窃&#xff0c;并从中获益。 1. 识别并封锁恶意IP地址 当你发现某些IP地址频繁访问并抓取你的网站内容时&#xff0c…...

UDP报文格式

UDP是传输层的一个重要协议&#xff0c;他的特性有面向数据报、无连接、不可靠传输、全双工。 下面是UDP报文格式&#xff1a; 1&#xff0c;报头 UDP的报头长度位8个字节&#xff0c;包含源端口、目的端口、长度和校验和&#xff0c;其中每个属性均为两个字节。报头格式为二…...

【工具类】获取日出日落时间的Java工具类

博主介绍&#xff1a;✌全网粉丝22W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

ES7【2016】、ES8【2017】新增特性(六)

ES7【2016】新增特性 幂指数操作符 在ES7【2016】中新增了幂指数操作&#xff0c;幂指数操作符是**。它用于指数计算 基本语法&#xff1a;baseValue ** exponent 参数说明&#xff1a;baseValue是基数&#xff0c;exponent是指数。 let base 2; let exponent 4; let resul…...

SparX:一种用于层次视觉Mamba和变换器网络的稀疏跨层连接机制

摘要 https://arxiv.org/pdf/2409.09649 由于动态状态空间模型&#xff08;SSMs&#xff09;能够以线性时间计算复杂度捕获长距离依赖关系&#xff0c;Mamba在自然语言处理&#xff08;NLP&#xff09;任务中表现出了显著的性能。这激发了基于Mamba的视觉模型的快速发展&#…...

Spring Boot 中实现 WebSocket 的方式

在 Spring Boot 中实现 WebSocket 的方式主要有以下几种,每种方式适用于不同的场景和需求: 1. 基于 Spring WebSocket 的实现 特点: 原生支持 WebSocket,基于 Spring 提供的 API。使用 WebSocketConfigurer 和 WebSocketHandler 配置端点和消息处理逻辑。可以通过拦截器访…...

时序数据库TDengine 3.3.5.0 发布:高并发支持与增量备份功能引领新升级

近日&#xff0c;TDengine 3.3.5.0 版本正式发布&#xff0c;带来了多项重磅更新与优化&#xff0c;从功能拓展到性能提升&#xff0c;再到用户体验进行了全面改进。本次更新围绕用户核心需求展开&#xff0c;涵盖了开发工具、数据管理、安全性、可视化等多个层面&#xff0c;为…...

Elasticsearch:Jira 连接器教程第一部分

作者&#xff1a;来自 Elastic Gustavo Llermaly 将我们的 Jira 内容索引到 Elaasticsearch 中以创建统一的数据源并使用文档级别安全性进行搜索。 在本文中&#xff0c;我们将回顾 Elastic Jira 原生连接器的一个用例。我们将使用一个模拟项目&#xff0c;其中一家银行正在开发…...

HarmonyOS NEXT开发进阶(六):HarmonyOS NEXT实现嵌套 H5 及双向通信

文章目录 一、前言二、鸿蒙应用加载Web页面2.1 加载网络地址页面2.2 加载本地H5页面 三、实现Web组件 H5 层与鸿蒙应用层进行相互通讯3.1 鸿蒙应用向 H5 页面发送数据3.2 H5页面向鸿蒙应用发送数据 四、拓展阅读 一、前言 随着HarmonyOS NEXT的快速发展&#xff0c;越来越多的…...

Myeclipse最新版本 C1 2019.4.0

Myeclipse C1 2019.4.0下载地址&#xff1a;链接: https://pan.baidu.com/s/1MbOMLewvAdemoQ4FNfL9pQ 提取码: tmf6 1.1、什么是集成开发环境? ★集成开发环境讲究-站式开发&#xff0c;使用这个工具即可。有提示功能&#xff0c;有自动纠错功能。 ★集成开发环境可以让软件开…...

深度学习中PyTorch张量的重塑操作

深度学习中PyTorch张量的重塑操作 张量操作类型 在我们深入具体的张量操作之前&#xff0c;让我们先快速浏览一下主要的操作类别&#xff0c;这些类别包括我们将要介绍的操作。我们有以下高级类别的操作&#xff1a; 重塑操作元素级操作归约操作访问操作 有很多单独的操作&…...

lua下标是可以从0开始

故事背景&#xff0c;策划搞了一个功能配置表&#xff0c;我看居然是0开始的&#xff0c;功能也正常。于是测试了下&#xff0c;还真的可以。网上看了资料确实可以&#xff0c;但是也有需要注意的问题 local test {[0] 0} for k,v in pairs(test)doprint(k,v) endhttps://bl…...

从AI原理到模型演进及代码实践 的学习二

参考&#xff1a;全面解析&#xff1a;从AI原理到模型演进及代码实践-CSDN博客 训练过程 Transformer仅一个Encoder模块就可以工作&#xff0c;可以处理信息抽取、识别、主体识别等任务&#xff0c;比如 BERT&#xff08;Bidirectional Encoder Representations from Transfor…...

计算机组成原理(计算机系统3)--实验二:MIPS64乘法实现实验

一、实验目标&#xff1a; 实际运用WinMIPS64进行试验&#xff0c;以期更了解WinMIPS64的操作&#xff1b; 更加深入地了解MIPS程序的语法&#xff1b; 深入地了解在计算机中乘法的实现以及加法与乘法之间的关系。 二、实验内容 按照实验报告指导&#xff0c;完成相关操作…...

WPS excel使用宏编辑器合并 Sheet工作表

使用excel自带的工具合并Sheet表&#xff0c;我们会发现需要开通WPS会员才能使用合并功能&#xff1b; 那么WPS excel如何使用宏编辑器进行合并 Sheet表呢&#xff1f; 1、首先我们要看excel后缀是 .xlsx 还是 .xls &#xff1b;如果是.xlsx 那么 我们需要修改为 .xls 注…...

ASP.NET Core - 配置系统之配置添加

ASP.NET Core - 配置系统之配置添加 2. 配置添加 2. 配置添加 配置系统可以读取到配置文件中的信息&#xff0c;那必然有某个地方可以将配置文件添加到配置系统中。之前的文章中讲到 ASP.NET Core 入口文件中&#xff0c;builder(WebApplicationBuilder 对象) 中有一个 Config…...

【Redis】Redis 集群中节点之间如何通信?

【Redis】Redis 集群中节点之间如何通信&#xff1f; 一背景概述二通信协议Gossip 协议 三通信机制Gossip 消息类型(1).Ping消息(2).Pong消息(3).Meet消息(4).Fail消息 消息传播模式(1).反熵(Anti-entropy)(2).谣言传播(Rumor mongering) 四通信过程通信端口通信频率故障检测与…...

iOS - 内存对齐

1. 基本的内存对齐 // 对象内存对齐 struct objc_object {// isa 指针 8 字节对齐isa_t isa __attribute__((aligned(8))); };// 定义对齐常量 #define WORD_MASK 7UL // 字对齐掩码 #define WORD_SHIFT 3UL // 字对齐位移 #define WORD_SIZE 8 …...

RabbitMQ(四)

SpringBoot整合RabbitMQ SpringBoot整合1、生产者工程①创建module②配置POM③YAML④主启动类⑤测试程序 2、消费者工程①创建module②配置POM③YAML文件内配置&#xff1a; ④主启动类⑤监听器 3、RabbitListener注解属性对比①bindings属性②queues属性 SpringBoot整合 1、生…...

unity学习17:unity里的旋转学习,欧拉角,四元数等

目录 1 三维空间里的旋转与欧拉角&#xff0c;四元数 1.1 欧拉角比较符合直观 1.2 四元数 1.3 下面是欧拉角和四元数的一些参考文章 2 关于旋转的这些知识点 2.1 使用euler欧拉角旋转 2.2 使用quaternion四元数,w,x,y,z 2.3 使用quaternion四元数,类 Vector3.zero 这种…...

当PHP遇上区块链:一场奇妙的技术之旅

PHP 与区块链的邂逅 在技术的广袤宇宙中&#xff0c;区块链技术如同一颗耀眼的新星&#xff0c;以其去中心化、不可篡改、透明等特性&#xff0c;掀起了一场席卷全球的变革浪潮。众多开发者怀揣着对新技术的热忱与探索精神&#xff0c;纷纷投身于区块链开发的领域&#xff0c;试…...

Portainer.io安装并配置Docker远程访问及CA证书

Portainer.io安装并配置Docker远程访问及CA证书 文章目录 Portainer.io安装并配置Docker远程访问及CA证书一.安装 Portainer.io2.启动容器 二.docker API远程访问并配置CA安全认证1.配置安全(密钥)访问2.补全CA证书信息3.生成server-key.pem4.创建服务端签名请求证书文件5.创建…...

从漏洞管理到暴露管理:网络安全的新方向

在网络安全的快速发展中&#xff0c;传统的漏洞管理仍然是防御体系的基石。然而&#xff0c;面对日益复杂的威胁和不断增长的漏洞数量&#xff0c;单靠漏洞优先级评分&#xff08;如VPR&#xff09;已经无法满足现代安全需求。暴露管理这一全新的思维模式正在引领企业从被动应对…...

GraphRAG如何使用ollama提供的llm model 和Embedding model服务构建本地知识库

使用GraphRAG踩坑无数 在GraphRAG的使用过程中将需要踩的坑都踩了一遍&#xff08;不得不吐槽下&#xff0c;官方代码有很多遗留问题&#xff0c;他们自己也承认工作重心在算法的优化而不是各种模型和框架的兼容性适配性上&#xff09;&#xff0c;经过了大量的查阅各种资料以…...

HTTP/HTTPS ⑤-CA证书 || 中间人攻击 || SSL/TLS

这里是Themberfue ✨上节课我们聊到了对称加密和非对称加密&#xff0c;实际上&#xff0c;单纯地非对称加密并不能保证数据不被窃取&#xff0c;我们还需要一个更加重要的东西——证书 中间人攻击 通过非对称加密生成私钥priKey和公钥pubKey用来加密对称加密生成的密钥&…...

MYSQL学习笔记(二):基本的SELECT语句使用(基本、条件、聚合函数查询)

前言&#xff1a; 学习和使用数据库可以说是程序员必须具备能力&#xff0c;这里将更新关于MYSQL的使用讲解&#xff0c;大概应该会更新30篇&#xff0c;涵盖入门、进阶、高级(一些原理分析);这一篇是讲解SELECT语句使用&#xff0c;包括基本、条件、聚合函数查询&#xff0c;…...

云原生周刊:Prometheus 3.0 正式发布

开源项目推荐 Achilles-SDK Achilles-SDK 是一个专为构建 Kubernetes 控制器而设计的开源开发工具包。它简化了控制器的开发流程&#xff0c;提供了强大的 API 和高效的抽象层&#xff0c;使开发者能够专注于业务逻辑的实现&#xff0c;而无需处理底层复杂性。Achilles-SDK 支…...

维护数据完整性(三)

立即检查的&#xff08;IMMEDIATE&#xff09;或者延迟检查的&#xff08;DEFERRED&#xff09; 使用 SET CONSTRAINTS 语句 SET CONSTRAINTS语句可以用来在事务内部改变约束的检查时机。以下是如何使用该语句的示例&#xff1a; SET CONSTRAINTS constraint_name DEFERRED;…...

前后端分离开发心得

前后端分离开发是一种软件开发模式&#xff0c;将前端和后端的开发分离开来&#xff0c;使得前端和后端可以独立开发、测试和部署。具体来说&#xff1a; • 前端&#xff1a;负责展示数据和用户交互&#xff0c;使用 HTML、CSS、JavaScript 等技术实现用户界面和交互逻辑&…...

Redisson发布订阅学习

介绍 Redisson 的消息订阅功能遵循 Redis 的发布/订阅模式&#xff0c;该模式包括以下几个核心概念&#xff1a; 发布者&#xff08;Publisher&#xff09;&#xff1a;发送消息到特定频道的客户端。在 Redis 中&#xff0c;这通过 PUBLISH 命令实现。 订阅者&#xff08;Sub…...

【Golang/nacos】nacos配置的增删查改,以及服务注册的golang实例及分析

前言 本文分析的实例来源于nacos在github上的开源仓库 nacos配置的增删查改 先具体来看一段代码&#xff0c;我将逐步分析每一段的作用 package mainimport ("fmt""time""github.com/nacos-group/nacos-sdk-go/clients""github.com/naco…...

[手机Linux] 七,NextCloud优化设置

安装完成后在个人设置里发现很多警告&#xff0c;一一消除。 只能一条一条解决了。 关于您的设置有一些错误。 1&#xff0c;PHP 内存限制低于建议值 512 MB。 设置php配置文件&#xff1a; /usr/local/php/etc/php.ini 把里面的&#xff1a; memory_limit 128M 根据你自…...

浅谈云计算15 | 存储可靠性技术(RAID)

存储可靠性技术 一、存储可靠性需求1.1 数据完整性1.2 数据可用性1.3 故障容错性 二、传统RAID技术剖析2.1 RAID 02.2 RAID 12.3 RAID 52.4 RAID 62.5 RAID 10 三、RAID 2.0技术3.1 RAID 2.0技术原理3.1.1 两层虚拟化管理模式3.1.2 数据分布与重构 3.2 RAID 2.0技术优势3.2.1 自…...

vscode【实用插件】Material Icon Theme 美化文件图标

安装 在 vscode 插件市场的搜索 Material Icon Theme点 安装 效果...

json().get() 和 json[““] 的区别

以下是 json().get() 和 json[“”] 的区别&#xff1a; 使用方法和语法 json[“”]&#xff1a; 这是使用字典的索引操作符 [] 来访问 JSON 数据。假设 json 是一个字典&#xff0c;你可以通过 json[“key”] 的方式来获取对应 key 的值。 示例&#xff1a; python import js…...

商用车电子电气零部件电磁兼容条件和试验—目录

写在前面 本系列文章主要讲解商用车电子/电气零部件或系统的传导抗干扰、传导发射和辐射抗干扰、电场辐射发射以及静电放电等试验内容及要求,高压试验项目内容及要求。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 目录 商用车电子电气零部件电磁兼容条件和试验(1)—…...

【新人系列】Python 入门(二十六):常见设计模式

✍ 个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4dd; 专栏地址&#xff1a;https://blog.csdn.net/newin2020/category_12801353.html &#x1f4e3; 专栏定位&#xff1a;为 0 基础刚入门 Python 的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们…...

【跟着官网学技术系列之MySQL】第7天之创建和使用数据库1

前言 在当今信息爆炸的时代&#xff0c;拥有信息检索的能力很重要。 作为一名软件工程师&#xff0c;遇到问题&#xff0c;你会怎么办&#xff1f;带着问题去搜索引擎寻找答案&#xff1f;亦或是去技术官网&#xff0c;技术社区去寻找&#xff1f; 根据个人经验&#xff0c;一…...

Spark任务提交流程

当包含在application master中的spark-driver启动后&#xff0c;会与资源调度平台交互获取其他执行器资源&#xff0c;并通过反向注册通知对应的node节点启动执行容器。此外&#xff0c;还会根据程序的执行规划生成两个非常重要的东西&#xff0c;一个是根据spark任务执行计划生…...

使用python+pytest+requests完成自动化接口测试(包括html报告的生成和日志记录以及层级的封装(包括调用Json文件))

一、API的选择 我们进行接口测试需要API文档和系统&#xff0c;我们选择JSONPlaceholder免费API&#xff0c;因为它是一个非常适合进行接口测试、API 测试和学习的工具。它免费、易于使用、无需认证&#xff0c;能够快速帮助开发者模拟常见的接口操作&#xff08;增、删、改、…...