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

Spark12: SparkSQL入门

一、SparkSQL

        Spark SQL和我们之前讲Hive的时候说的hive on spark是不一样的。hive on spark是表示把底层的mapreduce引擎替换为spark引擎。而Spark SQL是Spark自己实现的一套SQL处理引擎。Spark SQL是Spark中的一个模块,主要用于进行结构化数据的处理。它提供的最核心的编程抽象,就是DataFrame。
        DataFrame=RDD+Schema 。
        它其实和关系型数据库中的表非常类似,RDD可以认为是表中的数据,Schema是表结构信息。DataFrame可以通过很多来源进行构建,包括:结构化的数据文件,Hive中的表,外部的关系型数据库,以及RDD

注意:
Spark1.3出现的 DataFrame ,Spark1.6出现了 DataSet ,在Spark2.0中两者统一,DataFrame等于DataSet[Row]

二、SparkSession

        要使用Spark SQL,首先需要创建一个SpakSession对象。SparkSession中包含了SparkContext和SqlContext,所以说想通过SparkSession来操作RDD的话需要先通过它来获取SparkContext 这个SqlContext是使用sparkSQL操作hive的时候会用到的。

 SparkSession包含了SparkContext和SqlContext

(1)SparkContext 用于操作RDD

(2)SqlContext 用于操作hive

正常使用SparkSession操作DataFrame就可以了

三、创建DataFrame

        使用SparkSession,可以从RDD、HIve表或者其它数据源创建DataFrame
        那下面我们来使用JSON文件来创建一个DataFrame

1. 引用依赖

        <dependency><groupId>org.apache.spark</groupId><artifactId>spark-sql_2.11</artifactId><version>2.4.3</version>
<!--            <scope>provided</scope>--></dependency>

2. Scala代码

package com.sanqian.scala.sqlimport org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSessionobject SqlDemoScala {def main(args: Array[String]): Unit = {val conf = new SparkConf().setMaster("local")//创建SparkSession对象,里面包含SparkContext和SqlContextval sparkSession = SparkSession.builder().appName("SqlDemoScala").config(conf).getOrCreate()//读取json文件, 创建DataFrameval df = sparkSession.read.json("D:\\data\\spark\\student.json")//查DataFrame中的数据df.show()sparkSession.stop()}
}

3. Java代码

package com.sanqian.java.sql;import org.apache.spark.SparkConf;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;public class SqlDemoJava {public static void main(String[] args) {SparkConf conf = new SparkConf();conf.setMaster("local");//创建SparkSession对象,里面包含SparkContext和SqlContextSparkSession sparkSession = SparkSession.builder().appName("SqlDemoJava").config(conf).getOrCreate();//读取json文件,获取DataSet<Row>Dataset<Row> df = sparkSession.read().json("D:\\data\\spark\\student.json");df.show();sparkSession.stop();}
}

4. DataFrame 和DataSet的转换 

        由于DataFrame等于DataSet[Row],它们两个可以互相转换,所以创建哪个都是一样的。咱们前面的scala代码默认创建的是DataFrame,java代码默认创建的是DataSet。
        尝试对他们进行转换
        1)在Scala代码中将DataFrame转换为DataSet[Row],对后面的操作没有影响

//将DataFrame转换为DataSet[Row]
val stuDf = sparkSession.read.json("D:\\student.json").as("stu")

        2)在Java代码中将DataSet[Row]转换为DataFrame

//将Dataset<Row>转换为DataFrame
Dataset<Row> stuDf = sparkSession.read().json("D:\\student.json").toDF();

四、DataFrame常见算子操作

1. 官方文档

 

2. DataFrame算子

• printSchema()  : 打印schema信息
• show() :默认显示所有的数据,可以通过参数控制显示多少条
• select() : 查询数据中指定字段信息,在使用$对数据做一些操作,需要添加隐式转换函数,否则语法报错
• filter()、where() :对数据进行 过滤,where底层调用的就是filter
• groupBy() : 对数据进行分组求和
• count() : 求和

注意:在使用$对数据做一些操作,需要添加隐式转换函数,否则语法报错

import sparkSession.implicits._

Scala代码

package com.sanqian.scala.sqlimport org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSessionobject DataFrameOpScala {def main(args: Array[String]): Unit = {val conf = new SparkConf()conf.setMaster("local")val sparkSession = SparkSession.builder().appName("DataFrameOpScala").config(conf).getOrCreate()val df = sparkSession.read.json("D:\\data\\spark\\student.json")//打印schema信息df.printSchema()//默认显示所有数据,可以通过参数控制显示多少条df.show(2)//查询数据中的指定字段信息df.select("name", "age").show()//在使用select的时候可以对数据做一些操作,需要添加隐式转换函数,否则语法报错import sparkSession.implicits._df.select($"name", $"age" + 1).show()df.filter($"age" > 18).show()//对数据进行分组求和df.groupBy("age").count().show()sparkSession.stop()}
}

Java代码

package com.sanqian.java.sql;import org.apache.spark.SparkConf;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import static org.apache.spark.sql.functions.col;public class DataFrameOpJava {public static void main(String[] args) {SparkConf conf = new SparkConf();conf.setMaster("local");//创建SparkSession对象,里面包含SparkContext和SqlContextSparkSession sparkSession = SparkSession.builder().appName("DataFrameOpJava").config(conf).getOrCreate();Dataset<Row> ds = sparkSession.read().json("D:\\data\\spark\\student.json");//打印schema信息ds.printSchema();ds.show(2);ds.select("name", "age").show();//在select的时候可以对数据做一些操作,需要引入import static org.apache.spark.sql.functions.col;ds.select(col("name"), col("age").plus(1)).show();//对数据进行过滤ds.filter(col("age").gt(18)).show();ds.where(col("age").gt(18)).show();//对数据进行分组求和ds.groupBy("age").count().show();sparkSession.stop();}
}

        这些就是针对DataFrame的一些常见的操作。但是现在这种方式其实用起来还是不方便,只是提供了一些类似于可以操作表的算子,很对一些简单的查询还是可以的,但是针对一些复杂的操作,使用算子写起来就很麻烦了,所以我们希望能够直接支持用sql的方式执行,Spark SQL也是支持的。

五、DataFrame的sql操作

想要实现直接支持sql语句查询DataFrame中的数据
需要两步操作
1. 先将DataFrame注册为一个临时表
2. 使用sparkSession中的sql函数执行sql语句

1. Scala代码

package com.sanqian.scala.sqlimport org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSessionobject DataFrameSqlScala {def main(args: Array[String]): Unit = {val conf = new SparkConf()conf.setMaster("local")val sparkSession = SparkSession.builder().appName("DataFrameOpScala").config(conf).getOrCreate()val df = sparkSession.read.json("D:\\data\\spark\\student.json")//将DataFrame注册为一个临时表df.createOrReplaceTempView("student")//使用sql查询临时表中的数据sparkSession.sql("select age, count(*) as num from student group by age").show()sparkSession.stop()}
}

2. Java代码

package com.sanqian.java.sql;import org.apache.spark.SparkConf;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;public class DataFrameSqlJava {public static void main(String[] args) {SparkConf conf = new SparkConf();conf.setMaster("local");//创建SparkSession对象,里面包含SparkContext和SqlContextSparkSession sparkSession = SparkSession.builder().appName("DataFrameOpJava").config(conf).getOrCreate();Dataset<Row> ds = sparkSession.read().json("D:\\data\\spark\\student.json");ds.createOrReplaceTempView("student");sparkSession.sql("select age, count(*) as num from student group by age").show();sparkSession.stop();}
}

六、RDD转换为DataFrame

为什么要将RDD转换为DataFrame?
        在实际工作中我们可能会先把hdfs上的一些日志数据加载进来,然后进行一些处理,最终变成结构化的数据,希望对这些数据做一些统计分析,当然了我们可以使用spark中提供的transformation算子来实现,只不过会有一些麻烦,毕竟是需要写代码的,如果能够使用sql实现,其实是更加方便的。所以可以针对我们前面创建的RDD,将它转换为DataFrame,这样就可以使用dataFrame中的一些算子或者直接写sql来操作数据了。


Spark SQL支持这两种方式将RDD转换为DataFrame

1. 反射方式
2. 编程方式

(一)反射方式

 下面来看一下反射方式:
        这种方式是使用反射来推断RDD中的元数据。基于反射的方式,代码比较简洁,也就是说当你在写代码的时候,已经知道了RDD中的元数据,这样的话使用反射这种方式是一种非常不错的选择。Scala具有隐式转换的特性,所以spark sql的scala接口是支持自动将包含了case class的RDD转换为DataFrame的
        下面来举一个例子

1. scala代码

package com.sanqian.scala.sqlimport org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSessionobject RddToDataFrameByReflectScala {def main(args: Array[String]): Unit = {val conf = new SparkConf()conf.setMaster("local")val sparkSession = SparkSession.builder().appName("RddToDataFrameByReflectScala").config(conf).getOrCreate()val sc = sparkSession.sparkContextval rdd = sc.parallelize(Array(("jack", 18), ("tom", 20), ("jess", 30)))//基于反射直接将包含Student对象的RDD转换为DataFrame//需要导入隐式转换import sparkSession.implicits._val df = rdd.map(tup => Student(tup._1, tup._2)).toDF()df.createOrReplaceTempView("student")//执行sql查询val rdd2 = sparkSession.sql("select name, age from student where age > 18")rdd2.show()//将DataFrame转化为RDDrdd2.map(row => Student(row(0).toString, row(1).toString.toInt)).collect().foreach(println(_))//使用row的getAs()方法,获取指定列名的值rdd2.map(row => Student(row.getAs[String]("name"), row.getAs[Int]("age"))).collect().foreach(println(_))sparkSession.stop()}
}
//定义一个Student
case class Student(name: String, age: Int)

2. java代码

package com.sanqian.java.sql;import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import scala.Tuple2;
import sun.awt.windows.WPrinterJob;import java.io.Serializable;
import java.util.Arrays;
import java.util.List;public class RddToDataFrameByReflectJava {public static void main(String[] args) {SparkConf conf = new SparkConf();conf.setMaster("local");//创建SparkSession对象,里面包含SparkContext和SqlContextSparkSession sparkSession = SparkSession.builder().appName("RddToDataFrameByReflectJava").config(conf).getOrCreate();//获取SparkContext//从sparkSession中获取的是scala中的sparkContext,所以需要转换成java中的sparkContextJavaSparkContext sc = JavaSparkContext.fromSparkContext(sparkSession.sparkContext());Tuple2<String, Integer> t1 = new Tuple2<>("jack", 18);Tuple2<String, Integer> t2 = new Tuple2<>("tom", 20);Tuple2<String, Integer> t3 = new Tuple2<>("jess", 30);JavaRDD<Tuple2<String, Integer>> rdd = sc.parallelize(Arrays.asList(t1, t2, t3));JavaRDD<Student> rdd2 = rdd.map(new Function<Tuple2<String, Integer>, Student>() {@Overridepublic Student call(Tuple2<String, Integer> tup) throws Exception {return new Student(tup._1, tup._2);}});//注意:Student这个类必须声明为public,并且必须实现序列化Dataset<Row> df = sparkSession.createDataFrame(rdd2, Student.class);df.createOrReplaceTempView("student");//执行sql查询Dataset<Row> df2 = sparkSession.sql("select name, age from student where age > 18");df2.show();//将DataFrame转化为RDD,注意:这里需要转为JavaRDDJavaRDD<Row> resRDD = df2.javaRDD();//从row中取数据,封装成student,打印到控制台List<Student> resList = resRDD.map(new Function<Row, Student>() {@Overridepublic Student call(Row row) throws Exception {return new Student(row.getAs("name").toString(), Integer.parseInt(row.getAs("age").toString()));}}).collect();for(Student stu: resList){System.out.println(stu);}sparkSession.stop();}
}

(二)编程方式

        这种方式是通过编程接口来创建DataFrame,你可以在程序运行时动态构建一份元数据,就是Schema,然后将其应用到已经存在的RDD上。这种方式的代码比较冗长,但是如果在编写程序时,还不知道RDD的元数据,只有在程序运行时,才能动态得知其元数据,那么只能通过这种动态构建元数据的方式。也就是说当case calss中的字段无法预先定义的时候,就只能用编程方式动态指定元数据了。

1. Scala代码

package com.sanqian.scala.sqlimport org.apache.spark.SparkConf
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
import org.apache.spark.sql.{Row, SparkSession}/*** 需求:使用编程方式实现RDD转换为DataFrame**/
object RddToDataFrameByProgramScala {def main(args: Array[String]): Unit = {val conf = new SparkConf().setMaster("local")//创建SparkSession对象,里面包含SparkContext和SqlContextval sparkSession = SparkSession.builder().appName("RddToDataFrameByProgramScala").config(conf).getOrCreate()//获取SparkContextval sc = sparkSession.sparkContextval dataRDD = sc.parallelize(Array(("jack", 18), ("tom", 20), ("jessic", 30)))//组装rowRDDval rowRDD = dataRDD.map(tup => Row(tup._1, tup._2))//指定元数据信息【这个元数据信息就可以动态从外部获取了,比较灵活】val schema = StructType(Array(StructField("name", StringType, true),StructField("age", IntegerType, true)))//组装DataFrameval stuDf = sparkSession.createDataFrame(rowRDD, schema)//下面就可以通过DataFrame的方式操作dataRDD中的数据了stuDf.createOrReplaceTempView("student")//执行sql查询val resDf = sparkSession.sql("select name,age from student where age > 18")//将DataFrame转化为RDDval resRDD = resDf.rddresRDD.map(row => (row(0).toString, row(1).toString.toInt)).collect().foreach(println(_))sparkSession.stop()}
}

2. Java代码

package com.sanqian.java.sql;import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;
import scala.Tuple2;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class RddToDataFrameByProgramJava {public static void main(String[] args) {SparkConf conf = new SparkConf();conf.setMaster("local");
//创建SparkSession对象,里面包含SparkContext和SqlContextSparkSession sparkSession = SparkSession.builder().appName("RddToDataFrameByProgramJava").config(conf).getOrCreate();//获取SparkContext//从sparkSession中获取的是scala中的sparkContext,所以需要转换成java中的sparkContextJavaSparkContext sc = JavaSparkContext.fromSparkContext(sparkSession.sparkContext());Tuple2<String, Integer> t1 = new Tuple2<String, Integer>("jack", 18);Tuple2<String, Integer> t2 = new Tuple2<String, Integer>("tom", 20);Tuple2<String, Integer> t3 = new Tuple2<String, Integer>("jessic",30);JavaRDD<Tuple2<String, Integer>> dataRDD = sc.parallelize(Arrays.asList(t1, t2, t3));
//组装rowRDDJavaRDD<Row> rowRDD = dataRDD.map(new Function<Tuple2<String, Integer >, Row >() {@Overridepublic Row call (Tuple2 < String, Integer > tup) throws Exception {return RowFactory.create(tup._1, tup._2);}});
//指定元数据信息ArrayList<StructField> structFieldList = new ArrayList<StructField>();structFieldList.add(DataTypes.createStructField("name", DataTypes.StringType, true));structFieldList.add(DataTypes.createStructField("age", DataTypes.IntegerType, true));StructType schema = DataTypes.createStructType(structFieldList);
//构建DataFrameDataset<Row> stuDf = sparkSession.createDataFrame(rowRDD, schema);stuDf.createOrReplaceTempView("student");
//执行sql查询Dataset<Row> resDf = sparkSession.sql("select name,age from student where age > 18");
//将DataFrame转化为RDD,注意:这里需要转为JavaRDDJavaRDD < Row > resRDD = resDf.javaRDD();List<Tuple2<String, Integer>> resList = resRDD.map(new Function<Row, Tuple2<String, Integer>>() {@Overridepublic Tuple2<String, Integer> call(Row row) throws Exception {return new Tuple2<String, Integer>(row.getString(0), row.getInt(1));}}).collect();for (Tuple2<String, Integer> tup : resList) {System.out.println(tup);}sparkSession.stop();}
}

 七、load和save操作

        对于Spark SQL的DataFrame来说,无论是从什么数据源创建出来的DataFrame,都有一些共同的load和save操作。
        load操作主要用于加载数据,创建出DataFrame;
        save操作,主要用于将DataFrame中的数据保存到文件中。

        我们前面操作json格式的数据的时候好像没有使用load方法,而是直接使用的json方法,这是什么特殊用法吗?查看json方法的源码会发现,它底层调用的是format和load方法

def json(paths: String*): DataFrame = format("json").load(paths : _*)

注意:如果看不到源码,需要点击idea右上角的download source提示信息下载依赖的源码。

        我们如果使用原始的format和load方法加载数据,此时如果不指定format,则默认读取的数据源格式是parquet,也可以手动指定数据源格式。Spark SQL 内置了一些常见的数据源类型,比如json, parquet, jdbc, orc, csv, text 通过这个功能,就可以在不同类型的数据源之间进行转换了。

1. Scala代码

package com.sanqian.scala.sqlimport org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSessionobject LoadAndSaveOpScala {def main(args: Array[String]): Unit = {val conf = new SparkConf().setMaster("local")//创建SparkSession对象,里面包含SparkContext和SqlContextval sparkSession = SparkSession.builder().appName("LoadAndSaveOpScala").config(conf).getOrCreate()//读取数据val stuDf = sparkSession.read.format("json").load("D:\\data\\spark\\student.json")//保存数据stuDf.select("name", "age").write.format("csv").save("hdfs://bigdata01:9000/out-save001")sparkSession.stop()}
}

2. Java代码

package com.sanqian.java.sql;import org.apache.spark.SparkConf;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;public class LoadAndSaveOpJava {public static void main(String[] args) {SparkConf conf = new SparkConf();conf.setMaster("local");//创建SparkSession对象,里面包含SparkContext和SqlContextSparkSession sparkSession = SparkSession.builder().config(conf).appName("LoadAndSaveOpJava").getOrCreate();//读取数据Dataset<Row> df = sparkSession.read().format("json").load("D:\\data\\spark\\student.json");//保存数据df.select("name", "age").write().format("csv").save("hdfs://bigdata01:9000/out-save002");sparkSession.stop();}
}

八、SaveMode

        Spark SQL对于save操作,提供了不同的save mode。
        主要用来处理,当目标位置已经有数据时应该如何处理。save操作不会执行锁操作,并且也不是原子的,因此是有一定风险出现脏数据的。

SaveMode        解释
1SaveMode.ErrorIfExists (默认)如果目标位置已经存在数据,那么抛出一个异常
2SaveMode.Append如果目标位置已经存在数据,那么将数据追加进去
3SaveMode.Overwrite如果目标位置已经存在数据,那么就将已经存在的数据删除,用新数据进行覆盖
4SaveMode.Ignore如果目标位置已经存在数据,那么就忽略,不做任何操作
//保存数据df.select("name", "age").write().format("csv").mode(SaveMode.Append).save("hdfs://bigdata01:9000/out-save002");

执行之后的结果确实是追加到之前的结果目录中了

九、内置函数

        Spark中提供了很多内置的函数

(1)聚合函数: avg, count, countDistinct, first, last, max, mean, min, sum, sumDistinct

(2)集合函数:array_contains, explode, size

(3)日期/时间函数: datediff, date_add, date_sub, add_months, last_day, next_day, months_between, current_date, current_timestamp, date_format

(4)数学函数:abs, ceil, floor, round

(5)混合函数:if, isnull, md5, not, rand, when

(6)字符串函数:concat, get_json_object, length, reverse, split, upper

(7)窗口函数:denseRank, rank, rowNumber

其实这里面的函数和hive中的函数是类似的

注意: SparkSQL中的SQL函数文档不全,其实在使用这些函数的时候,大家完全可以去查看hive中sql的文档,使用的时候都是一样的。

相关文章:

Spark12: SparkSQL入门

一、SparkSQL Spark SQL和我们之前讲Hive的时候说的hive on spark是不一样的。hive on spark是表示把底层的mapreduce引擎替换为spark引擎。而Spark SQL是Spark自己实现的一套SQL处理引擎。Spark SQL是Spark中的一个模块&#xff0c;主要用于进行结构化数据的处理。它提供的最核…...

show profile和trance分析SQL

目录 一.show profile分析SQL 二.trance分析优化器执行计划 一.show profile分析SQL Mysql从5.0.37版本开始增加了对show profiles和show profile语句的支持。show profiles能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。。 通过have_profiling参数&#xff0c;能够…...

[AI生成图片] 效果最好的Midjourney 的介绍和使用

Midjourney介绍&#xff1a; 是一个文本生成图片的扩散模型&#xff0c;能够根据输入的任何文本生成令人难以置信的图像&#xff0c;让数十亿人在几秒钟内创造惊人的艺术。为方便用户控制和快速生成图片&#xff0c;打开后在页面底部输入文本内容&#xff0c;稍等一小会&#…...

Vue.use( ) 的核心原理

首先来思考几个问题&#xff1a; Vue.use是什么&#xff1f; vue.use() 是vue提供的一个静态方法&#xff0c;主要是为了注册插件&#xff0c;增加vue的功能。 Vue.use( plugin ) plugin只能是Object 或 Function vue.use()做了什么工作&#xff1f; 该js如果是对象 该对象…...

idea同时编辑多行-winmac都支持

1背景介绍 idea编辑器非常强大&#xff0c;其中一个功能非常优秀&#xff0c;很多程序员也非常喜欢用。这个功能能够大大大提高工作效率-------------多行代码同时编辑 2win 2.1方法1 按住alt鼠标左键上/下拖动即可 这样选中多行后&#xff0c;可以直接多行编辑。 优点&a…...

亿级高并发电商项目-- 实战篇 --万达商城项目 十一(编写商品搜索功能、操作商品同步到ES、安装RabbitMQ与Erlang,配置监听队列与消息队列)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…...

数据结构概述和稀疏数组

数据结构和算法内容介绍 1&#xff09;算法是程序的灵魂&#xff0c;优秀的程序可以在海量数据计算时&#xff0c;仍然保持高速计算 数据结构和算法概述 1&#xff09;程序 数据结构算法 2&#xff09;学好数据结构可以编写出更加漂亮&#xff0c;更加有效率的代码 3&…...

宝塔搭建实战人才求职管理系统adminm前端vue源码(三)

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 上一期给大家分享骑士cms后台admin前端vue在本地运行打包、宝塔发布部署的方式&#xff0c;本期给大家分享&#xff0c;后台adminm移动端后台vue前端怎么在本地运行&#xff0c;打包&#xff0c;实现线上功能更新…...

服务器是干什么用的?

首先&#xff0c;什么是服务器&#xff1f;服务器是提供计算服务器和网络服务的设备。服务器和计算机由CPU、硬盘、内存、系统总线等组成。比如我们访问一个网站&#xff0c;点击这个网站会发出访问请求&#xff0c;服务器会响应服务请求&#xff0c;进行相应的处理&#xff0c…...

C++ 之结构体与共用体

文章目录参考描述结构体使用&#xff08;基本&#xff09;声明初始化先创建后初始化C 11 列表初始化使用&#xff08;进阶&#xff09;结构数组声明&#xff08;拓展&#xff09;声明及创建声明及初始化匿名结构体细节外部声明与内部声明成员赋值共用体存储空间匿名共用体同化尾…...

Java基础知识汇总(良心总结)

1. 前言 本文章是对Java基础知识进行了汇总&#xff0c;方便大家学习。 申明&#xff1a;文章的内容均来自黑马程序员&#xff0c;博主只是将其搬到了CSDN上以共享给大家学习 2. 目录 Day01 Java学习笔记之《开章》 Day02 Java学习笔记之《运算符》 Day03 Java学习笔记之《流程…...

InnoDB之Undo log格式

1. 前言 InnoDB有两大日志模块&#xff0c;分别是redo log和undo log。为了避免磁盘随机写&#xff0c;InnoDB设计了redo log&#xff0c;数据写入时只写缓冲页和redo log&#xff0c;脏页由后台线程异步刷盘&#xff0c;哪怕系统崩溃也能根据redo log恢复数据。但是我们漏了一…...

一问学习StreamAPI终端操作

Java Stream管道流是用于简化集合类元素处理的java API。 在使用的过程中分为三个阶段&#xff1a; 将集合、数组、或行文本文件转换为java Stream管道流管道流式数据处理操作&#xff0c;处理管道中的每一个元素。上一个管道中的输出元素作为下一个管道的输入元素。管道流结果…...

在屎山代码中快速找到想要的代码法-锁表法(C#)

由于本人水平有限&#xff0c;文中有写得不对的地方请指正&#xff0c;本文的方法有些投机取巧&#xff0c;实在是没招的情况下可以酌情使用&#xff0c;如有侵权&#xff0c;请联系删除。 前几天接到一个需求&#xff0c;要在医嘱签署时对检验项目进行分方操作&#xff0c;分…...

网页设计html期末大作业

网页设计html期末大作业网页设计期末大作业-自制网站大一期末作业&#xff0c;外卖网站设计网页设计期末大作业-精美商城-首页框架网页设计期末大作业-自制网站 有导航栏&#xff0c;轮播图&#xff0c;按钮均可点进去&#xff0c;如下图所示 点我下载资源》》》》 大一期末…...

实战打靶集锦-006-Stapler

**写在前面&#xff1a;**记录博主的一次打靶经历。 目录1. 主机发现2. 端口发现3. 服务枚举4. 服务探查4.1 FTP探查4.1.1 匿名登录4.1.2 Elly用户4.1.3 John用户4.1.4 EXP搜索4.2 dnsmasq探查4.2.1 基础信息获取4.2.2 EXP搜索4.3 WEB应用探查4.3.1 浏览器访问4.3.2 目录扫描4.…...

致远OAA6版安装

准备工作&#xff0c;操作系统winserver2019&#xff0c;sqlserver2019。致远OA安装包0.SeeyonInstall.zip相关下载&#xff1a;winserver2019下载地址&#xff1a;cn_windows_server_2019_updated_july_2020_x64_dvd_2c9b67da.iso magnet:?xturn:btih:22A410DEA1B0886354A34D…...

python实用脚本(六)—— pandas库的使用(生成、读取表格)

本期主题&#xff1a; python的pandas使用 往期链接&#xff1a; python实用脚本&#xff08;一&#xff09;—— 批量修改目标文件夹下的文件名python实用脚本&#xff08;二&#xff09;—— 使用xlrd读取excelpython实用脚本&#xff08;三&#xff09;—— 通过有道智云AP…...

字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码、解码问题等

编码解码一、背景二、字符的相关概念三、字符集3.1 ASCII[ˈski]3.1.1 ASCII的编码方式3.1.2 EASCII3.2 GBK3.2.1 GB 2312-803.2.2 GBK的制订3.2.3 GBK的实现方式3.3 Unicode&#xff08;统一码、万国码&#xff09;3.3.1 Unicode的出现背景3.3.2 Unicode的编写方式3.3.3 Unico…...

Java 布隆过滤器

你在么&#xff1f;在&#xff01;一定在么&#xff1f;不在&#xff01;一定不在么&#xff1f; 你想要100%的准去性&#xff0c;还是99%的准确性附带较高的速度和较小的资源消耗。 任何算法&#xff0c;任何经营收到的背后&#xff0c;都是时间效益 资源消耗 准确性的平衡&am…...

vscode连接服务器(腾讯云)

文章目录1. vscode远程总是报错2. vscode能连上腾讯云但密码不对或者登录后不能打开文件或文件夹1. vscode远程总是报错 报错如图所示 Could not establish connection to *** 过程试图写入的管道不存在。 在百度、csdn找了好久都是说删掉.ssh文件下的某个文件但我压根没有&a…...

IOS崩溃文件符号化实践

1.背景与项目难点 1.1 背景 由于公司之前使用的友盟要收费&#xff0c;filebase服务由谷歌提供&#xff0c;存在数据合规风险。需要实现稳定性分析功能&#xff0c;通过支持app崩溃信息实时采集、实时上报、实时自动解析并定位出代码问题&#xff0c;帮助研发同学及时定位崩溃…...

设计模式之适配器模式与桥接模式详解和应用

目录1 适配器模式1.1 定义1.2 应用场景1.3 适配器角色1.4 类适配器1.5 对象适配器1.5 接口适配器1.6 实战1.7 源码1.8 适配器与装饰器的对比1.9 适配器模式的优缺点1.10 总结2 桥接模式2.1 原理解析2.2 角色2.3 通用写法2.4 应用场景2.5 业务场景中的运用2.6 源码2.7 桥接模式优…...

Winform控件开发(14)——NotifyIcon(史上最全)

前言: 先看个气泡提示框的效果: 代码如下: 在一个button中注册click事件,当我们点击button1时,就能显示气泡 private void button1_Click(object sender, EventArgs e){notifyIcon1.Visible = true;notifyIcon1...

Verilog 学习第四节(从计数器到可控制线性序列机——LED实验进化六部曲)

从计数器到可控制线性序列机——LED实验进化六部曲一&#xff1a;让LED灯按照亮0.25s&#xff0c;灭0.75s的状态循环亮灭二&#xff1a;让LED灯按照亮0.25s&#xff0c;灭0.5s&#xff0c;亮0.75s&#xff0c;灭1s的状态循环亮灭三&#xff1a;让LED灯按照指定的亮灭模式亮灭&a…...

操作SSH无密登录配置

例如小编有三台服务器需要相互访问&#xff0c;就需要配置三台&#xff0c;这三台分别是hadoop102,hadoop103 , hadoop1041.打开三个服务器&#xff0c;分别生成hadoop102&#xff0c;hadoop103 , hadoop104的公钥和私钥输入命令&#xff0c;然后一直回车&#xff0c;这时候什么…...

Websocket详细介绍

需求背景 在某个资产平台&#xff0c;在不了解需求的情况下&#xff0c;我突然接到了一个任务&#xff0c;让我做某个页面窗口的即时通讯&#xff0c;想到了用websocket技术&#xff0c;我从来没用过&#xff0c;被迫接受了这个任务&#xff0c;我带着浓烈的兴趣&#xff0c;就…...

大数据书单(100本)

大数据书单&#xff08;100本&#xff09; 序号 书名 作者 出版社 1 Hadoop权威指南:大数据的存储与分析(第4版)(修订版)(升级版) Tom White 清华大学出版社 2 Hive编程指南 卡普廖洛 (Edward Capriolo) / 万普勒 (Dean Wampler) / 卢森格林 (Jason Rutherglen) / 曹坤 人民邮…...

python实战应用讲解-【语法基础篇】初识Python(附示例代码)

目录 前言 Python基础 基本概念: 为什么使用Python? Python2.x与3.x版本区别...

【2023保研夏令营】网安、CS(西交、华师、科、南等)

文章目录一、基本情况二、投递和入营情况三、考核情况1. 西交软院&#xff08;面试&#xff09;2. 川大网安&#xff08;笔试面试&#xff09;3. 华东师范数据学院&#xff08;机试面试&#xff09;4. 人大信息学院专硕&#xff08;机试面试&#xff0c;保密&#xff09;5. 南大…...

网站建设流程有/服务营销案例

为什么80%的码农都做不了架构师&#xff1f;>>> 行为型模式&#xff1a;Chain Of Responsibility 职责链模式 &#xff11;、请求的发送者与接受者 &#xff11;&#xff09;某些对象请求的接受者可能多种多样&#xff0c;变化无常...... &#xff12;&#xf…...

description+wordpress/销售平台排名

在上一篇(博客园的神回复&#xff0c;一起看看那些IT男的神回复[连载][一])中(ps: 这篇博客之所以改名是因为这次的神回复里有程序媛&#xff0c;所以用IT男不太合适)&#xff0c;博客园神回复还是挺受欢迎的&#xff0c;上一篇博客的神回复取材均来自博问区&#xff0c;在这篇…...

美国人做网站用的是什么字体/成品ppt网站国外

版权说明&#xff0c;本文参考tonymacx86的[Guide] Patching DSDT/SSDT for LAPTOP backlight control 如果转载&#xff0c;请注明原文地址&#xff1a;http://blog.csdn.net/wr132/article/details/54849387 前言 注意&#xff1a;本教程主要使用于Intel HD Graphic系列显卡…...

东莞常平建网站公司/百度引擎提交入口

Kubernetes创建初期&#xff0c;其本身在业界地位并不占优&#xff0c;前有长期占有主流市场的Mesos和基于Mesos的DCOS围追堵截&#xff0c;后有Docker Swarm依托自己的容器事实标准异军突起&#xff0c;反倒是Kubernetes只有谷歌的品牌。Kubernetes为什么能最后胜出&#xff0…...

九江的网站建设公司/手机网页制作软件

最近来自Docker官方网站的文章提到&#xff0c;从OpenStack Icehouse开始&#xff0c;Docker将与Heat集成。 而最早在OpenStack Havana 版本中&#xff0c;Docker 已经作为 Nova driver方式与OpenStack集成。本文将首先简单介绍Docker&#xff0c;然后介绍其与OpenStack 的集成…...

wordpress+获得子类id/2023新闻大事件摘抄

有人说改系统配置文件&#xff0c;虽说对geek们没啥&#xff0c;但是有一个更方便的方法&#xff0c;更好记。只需记住一个软件&#xff1a; GNOME Color Chooser。 安装完这个软件之后&#xff0c;选择Specific标签&#xff0c;更改Tooltips中的前景色&#xff08;字体颜色&…...