Spark-03: Spark SQL 基础编程

目录

1.Spark SQL 简介

2.SparkSession

3.Spark SQL 数据的读写

3.1 读写 TXT 文件

3.2 读写 CSV 文件

3.3 读写 JSON 文件

3.4 读写 Parquet 文件

3.5 读写 ORC 文件

3.6 读写MySQL数据库

4.Spark SQL 语法

4.1 SQL 语法

4.2 DSL 语法


1.Spark SQL 简介

        Spark SQL是Apache Spark的一个模块,用于处理结构化数据。它提供了两种编程抽象:DataFrame和DataSet,并作为分布式SQL查询引擎。

  • DataFrame

        DataFrame是一个分布式的数据集合,类似于传统数据库中的表,带有schema信息。DataFrame是以列式格式进行存储的,每一列可以是不同的数据类型(如整数、字符串等),并且每一列都有一个名称。

  • DataSet

        Dataset是在Spark 1.6中新增的一个接口,它提供了RDD(强类型,可以使用强大的lambda函数)的优点,以及Spark SQL优化执行引擎的优点。数据集可以从JVM对象构建,然后使用函数式转换(map,flatMap,filter等)进行操作。

2.SparkSession

        SparkSession是Spark 2.0版本引入的新概念,它是对SparkContext的升级和扩展。SparkSession提供了更加统一的API(在Spark 1.x版本中,每个API都需要一个对应的Context:例如StreamingContext、SQLContext、HiveContext等),包括SQL查询、数据转换、数据读写、注册数据源、管理配置等操作。
        SparkSession是Spark 应用程序的新入口点,要创建一个基本的SparkSession,只需使用SparkSession.builder即可:

  • Java实现代码
package com.yichenkeji.demo.sparkjava;import org.apache.spark.sql.SparkSession;public class SparkSqlDemo {public static void main(String[] args) {SparkSession spark = SparkSession.builder().master("local").appName("Spark SQL Demo")
//                .config("spark.some.config.option", "some-value").getOrCreate();spark.stop();}
}
  • Scala实现代码
package com.yichenkeji.demo.sparkscalaimport org.apache.spark.sql.SparkSessionobject SparkSqlDemo {def main(args: Array[String]): Unit = {val spark = SparkSession.builder().master("local").appName("Spark SQL Demo")
//      .config("spark.some.config.option", "some-value").getOrCreate()spark.stop}}

3.Spark SQL 数据的读写

3.1 读写 TXT 文件

        Spark SQL提供了spark.read().text("file_name")来将文本文件或目录下的文本文件读取到Spark DataFrame中,以及dataframe.write().text("path")来将数据写入文本文件。在读取文本文件时,每一行默认成为具有字符串“value”列的一行。在写入文本文件时以及dataframe对象中的每一行也只能有一列,否则会提示"Text data source supports only a single column, and you have 2 columns."错误。

  • Java代码实现:
package com.yichenkeji.demo.sparkjava;import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;public class SparkSqlTxtDemo {public static void main(String[] args) {SparkSession spark = SparkSession.builder().master("local").appName("Spark SQL TXT Demo")
//                .config("spark.some.config.option", "some-value").getOrCreate();//读取txt文件Dataset<Row> df1 = spark.read()
//                .option("lineSep", ",")//自定义行分隔符:默认是`\r`, `\r\n` and `\n`.text("F:\\24\\spark\\data\\people.txt");df1.show();//读取txt文件的另一种方式Dataset<Row> df2 = spark.read().format("text").load("F:\\24\\spark\\data\\people.txt");df2.show();//写入txt文件df1.write().text("F:\\24\\spark\\data\\people_1.txt");//写入txt文件的另外一种方式df2.write().format("text").save("F:\\24\\spark\\data\\people_2.txt");spark.stop();}
}
  • Scala代码实现:
package com.yichenkeji.demo.sparkscalaimport org.apache.spark.sql.SparkSessionobject SparkSqlTxtDemo {def main(args: Array[String]): Unit = {val spark = SparkSession.builder().master("local").appName("Spark SQL TXT Demo")//      .config("spark.some.config.option", "some-value").getOrCreate()//读取txt文件val df1 = spark.read.text("F:\\24\\spark\\data\\people.txt")df1.show//读取txt文件的另一种方式val df2 = spark.read.format("text").load("F:\\24\\spark\\data\\people.txt")df2.show//写入txt文件df1.write.text("F:\\24\\spark\\data\\people_1.txt")//写入txt文件的另一种方式df2.write.format("text").save("F:\\24\\spark\\data\\people_2.txt")spark.stop}}

3.2 读写 CSV 文件

        Spark SQL提供了spark.read().csv("file_name")将CSV格式的文件或文件夹读取到Spark DataFrame中,以及dataframe.write().csv("path")将数据写入CSV文件。

  • Java代码实现:
package com.yichenkeji.demo.sparkjava;import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;public class SparkSqlCsvDemo {public static void main(String[] args) {SparkSession spark = SparkSession.builder().master("local").appName("Spark SQL CSV Demo")
//                .config("spark.some.config.option", "some-value").getOrCreate();//读取CSV文件:CSV带有表头Dataset<Row> df1 = spark.read().option("header", "true")//设置是否有表头.option("delimiter", ";") //设置分隔符,默认是逗号.csv("F:\\24\\spark\\data\\people.csv");df1.show();//读取CSV文件:CSV带有表头//csv文件的另外一种读取方式Dataset<Row> df2 = spark.read().format("csv").option("header", "true")//设置是否有表头.option("delimiter", ";") //设置分隔符,默认是逗号.load("F:\\24\\spark\\data\\people.csv");df2.show();//写入CSV文件df1.write().csv("F:\\24\\spark\\data\\people_1.csv");//写入CSV文件的另外一种方式df2.write().format("csv").save("F:\\24\\spark\\data\\people_2.csv");spark.stop();}
}
  • Scala代码实现:
package com.yichenkeji.demo.sparkscalaimport org.apache.spark.sql.SparkSessionobject SparkSqlCsvDemo {def main(args: Array[String]): Unit = {val spark = SparkSession.builder().master("local").appName("Spark SQL CSV Demo")//      .config("spark.some.config.option", "some-value").getOrCreate()//读取CSV文件val df1 = spark.read.option("header", "true")//是否有表头.option("delimiter", ";") //分隔符.csv("F:\\24\\spark\\data\\people.csv")df1.show//读取CSV文件的另一种方式val df2 = spark.read.format("csv").option("header", "true") //是否有表头.option("delimiter", ";") //分隔符.load("F:\\24\\spark\\data\\people.csv")df2.show//写入csv文件df1.write.csv("F:\\24\\spark\\data\\people_1.csv")//写入csv文件的另一种方式df2.write.format("csv").save("F:\\24\\spark\\data\\people_2.csv")spark.stop}}

3.3 读写 JSON 文件

        Spark SQL提供了spark.read().json("file_name")将json格式的文件或文件夹读取到Spark DataFrame中,以及dataframe.write().json("path")将数据写入json文件。

  • Java代码实现:
package com.yichenkeji.demo.sparkjava;import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;public class SparkSqlJsonDemo {public static void main(String[] args) {SparkSession spark = SparkSession.builder().master("local").appName("Spark SQL JSON Demo")
//                .config("spark.some.config.option", "some-value").getOrCreate();//读取JSON文件Dataset<Row> df1 = spark.read().json("F:\\24\\spark\\data\\people.json");df1.show();//读取JSON文件//JSON文件的另外一种读取方式Dataset<Row> df2 = spark.read().format("json").load("F:\\24\\spark\\data\\people.json");df2.show();//写入JSON文件df1.write().json("F:\\24\\spark\\data\\people_1.json");//写入JSON文件的另外一种方式df2.write().format("csv").save("F:\\24\\spark\\data\\people_2.json");spark.stop();}
}
  • Scala代码实现:
package com.yichenkeji.demo.sparkscalaimport org.apache.spark.sql.SparkSessionobject SparkSqlJsonDemo {def main(args: Array[String]): Unit = {val spark = SparkSession.builder().master("local").appName("Spark SQL JSON Demo")//      .config("spark.some.config.option", "some-value").getOrCreate()//读取JSON文件val df1 = spark.read.json("F:\\24\\spark\\data\\people.json")df1.show//读取JSON文件的另一种方式val df2 = spark.read.format("json").load("F:\\24\\spark\\data\\people.json")df2.show//写入JSON文件df1.write.json("F:\\24\\spark\\data\\people_1.json")//写入JSON件的另一种方式df2.write.format("json").save("F:\\24\\spark\\data\\people_2.json")spark.stop}}

3.4 读写 Parquet 文件

        Parquet 是一种通用的列式存储格式,Parquet已广泛应用于Hadoop生态圈(MapReduce、Spark、Hive、Impala),是离线数仓的主要数据格式。Spark SQL提供了spark.read().parquet("file_name")将parquet格式的文件或文件夹读取到Spark DataFrame中,以及dataframe.write().parquet("path")将数据写入parquet文件。

  •  Java代码实现:
package com.yichenkeji.demo.sparkjava;import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;public class SparkSqlParquetDemo {public static void main(String[] args) {SparkSession spark = SparkSession.builder().master("local").appName("Spark SQL Parquet Demo")
//                .config("spark.some.config.option", "some-value").getOrCreate();//读取Parquet文件Dataset<Row> df1 = spark.read().parquet("F:\\24\\spark\\data\\users.parquet");df1.show();//Parquet件的另外一种读取方式Dataset<Row> df2 = spark.read().format("parquet").load("F:\\24\\spark\\data\\users.parquet");df2.show();//写入Parquet文件df1.write().parquet("F:\\24\\spark\\data\\users_1.parquet");//写入Parquet文件的另外一种方式df2.write().format("parquet").save("F:\\24\\spark\\data\\users_2.parquet");spark.stop();}
}
  • Scala代码实现:
package com.yichenkeji.demo.sparkscalaimport org.apache.spark.sql.SparkSessionobject SparkSqlParquetDemo {def main(args: Array[String]): Unit = {val spark = SparkSession.builder().master("local").appName("Spark SQL Parquet Demo")//      .config("spark.some.config.option", "some-value").getOrCreate()//读取Parquet文件val df1 = spark.read.parquet("F:\\24\\spark\\data\\users.parquet")df1.show//读取Parquet文件的另一种方式val df2 = spark.read.format("parquet").load("F:\\24\\spark\\data\\users.parquet")df2.show//写入Parquet文件df1.write.parquet("F:\\24\\spark\\data\\users_1.parquet")//写入Parquet件的另一种方式df2.write.format("parquet").save("F:\\24\\spark\\data\\users_2.parquet")spark.stop}}

3.5 读写 ORC 文件

        ORC是一种列式存储结构,ORC最早产生于Apache Hive,用于减小Hadoop文件的存储空间和加速Hive查询。和Parquet一样,ORC也广泛应用于Hadoop生态圈。Spark SQL提供了spark.read().orc("file_name")将orc格式的文件或文件夹读取到Spark DataFrame中,以及dataframe.write().orc("path")将数据写入orc文件。

  •  Java代码实现:
package com.yichenkeji.demo.sparkjava;import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;public class SparkSqlOrcDemo {public static void main(String[] args) {SparkSession spark = SparkSession.builder().master("local").appName("Spark SQL ORC Demo")
//                .config("spark.some.config.option", "some-value").getOrCreate();//读取ORC文件Dataset<Row> df1 = spark.read().orc("F:\\24\\spark\\data\\users.orc");df1.show();//ORC文件的另外一种读取方式Dataset<Row> df2 = spark.read().format("orc").load("F:\\24\\spark\\data\\users.orc");df2.show();//写入ORC文件df1.write().orc("F:\\24\\spark\\data\\users_1.orc");//写入ORC文件的另外一种方式df2.write().format("orc").save("F:\\24\\spark\\data\\users_2.orc");spark.stop();}
}
  • Scala代码实现:
package com.yichenkeji.demo.sparkscalaimport org.apache.spark.sql.SparkSessionobject SparkSqlOrcDemo {def main(args: Array[String]): Unit = {val spark = SparkSession.builder().master("local").appName("Spark SQL ORC Demo")//      .config("spark.some.config.option", "some-value").getOrCreate()//读取ORC文件val df1 = spark.read.orc("F:\\24\\spark\\data\\users.orc")df1.show//读取ORC文件的另一种方式val df2 = spark.read.format("orc").load("F:\\24\\spark\\data\\users.orc")df2.show//写入ORC文件df1.write.orc("F:\\24\\spark\\data\\users_1.orc")//写入ORC件的另一种方式df2.write.format("orc").save("F:\\24\\spark\\data\\users_2.orc")spark.stop}}

3.6 读写MySQL数据库

        Spark SQL 可以通过 JDBC 从关系型数据库中读取数据的方式创建 DataFrame,通过对DataFrame 一系列的计算后,还可以将数据再写回关系型数据库中。

  • Java代码实现:
package com.yichenkeji.demo.sparkjava;import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SaveMode;
import org.apache.spark.sql.SparkSession;import java.util.Properties;public class SparkSqlMySQLDemo {public static void main(String[] args) {SparkSession spark = SparkSession.builder().master("local").appName("Spark SQL MySQL Demo")
//                .config("spark.some.config.option", "some-value").getOrCreate();String url = "jdbc:mysql://localhost:3307/demo?useSSL=false";String user = "root";String password = "wsx-123";String driver = "com.mysql.cj.jdbc.Driver";String table = "demo.dim_area";Properties properties = new Properties();properties.setProperty("user",user);properties.setProperty("password",password);properties.setProperty("driver",driver);properties.setProperty("url",url);properties.setProperty("useUnicode","true");properties.setProperty("characterEncoding","utf-8");//读取MySQL文件Dataset<Row> df1 = spark.read().jdbc(url,table,properties);df1.show(2);//MySQL的另外一种读取方式Dataset<Row> df2 = spark.read().format("jdbc").option("url", url).option("dbtable", table).option("user", user).option("password", password).load();df2.show(3);//        //写入MySQL文件df1.write().mode(SaveMode.Overwrite).jdbc(url,"dim_area_1",properties);
//        //写入MySQL的另外一种方式df2.write().mode(SaveMode.Overwrite).format("jdbc").option("url", url).option("dbtable", "dim_area_2").option("user", user).option("password", password).save();spark.stop();}
}
  • Scala代码实现:
package com.yichenkeji.demo.sparkscalaimport org.apache.spark.sql.{Dataset, Row, SaveMode, SparkSession}import java.util.Propertiesobject SparkSqlMySQLDemo {def main(args: Array[String]): Unit = {val spark = SparkSession.builder().master("local").appName("Spark SQL MySQL Demo")//      .config("spark.some.config.option", "some-value").getOrCreate()val url = "jdbc:mysql://localhost:3307/demo?useSSL=false"val user = "root"val password = "wsx-123"val driver = "com.mysql.cj.jdbc.Driver"val table = "demo.dim_area"val properties = new Propertiesproperties.setProperty("user", user)properties.setProperty("password", password)properties.setProperty("driver", driver)properties.setProperty("url", url)properties.setProperty("useUnicode", "true")properties.setProperty("characterEncoding", "utf-8")//读取MySQL文件val df1 = spark.read.jdbc(url, table, properties)df1.show(2)//MySQL的另外一种读取方式val df2 = spark.read.format("jdbc").option("url", url).option("dbtable", table).option("user", user).option("password", password).loaddf2.show(3)//写入MySQL文件df1.write.mode(SaveMode.Overwrite).jdbc(url, "dim_area_1", properties)//写入MySQL的另外一种方式df2.write.mode(SaveMode.Overwrite).format("jdbc").option("url", url).option("dbtable", "dim_area_2").option("user", user).option("password", password).savespark.stop}}

        注意:通过jdbc方式写入mysql数据库是,dataframe中的字段在保存的表中必须存在,否则报错。

4.Spark SQL 语法

4.1 SQL 语法

        SparkSession中的sql函数允许应用程序编程地运行SQL查询,并将结果作为DataFrame返回。这种方式的查询必须要有临时视图或者全局视图来辅助。

  • Java代码实现:
package com.yichenkeji.demo.sparkjava;import org.apache.spark.sql.AnalysisException;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;public class SparkSqlDemo {public static void main(String[] args) throws AnalysisException {SparkSession spark = SparkSession.builder().master("local").appName("Spark SQL Demo")
//                .config("spark.some.config.option", "some-value").getOrCreate();//读取CSV文件:CSV带有表头Dataset<Row> df1 = spark.read().option("header", "true")//设置是否有表头.option("delimiter", ";") //设置分隔符,默认是逗号.csv("F:\\24\\spark\\data\\people.csv");df1.show();//创建临时视图df1.createOrReplaceTempView("people");//创建全局临时视图df1.createGlobalTempView("people");Dataset<Row> sqlDF = spark.sql("SELECT * FROM people");sqlDF.show();//+-----+---+---------+//| name|age|      job|//+-----+---+---------+//|Jorge| 30|Developer|//|  Bob| 32|Developer|//+-----+---+---------+//全局临时视图保存在global_temp数据库中,使用全局临时视图时需要全路径访问,如:global_temp.peopleDataset<Row> sqlDF2 = spark.sql("SELECT name,age,job FROM global_temp.people WHERE age > 30");sqlDF2.show();//+-----+---+---------+//| name|age|      job|//+-----+---+---------+//|  Bob| 32|Developer|//+-----+---+---------+spark.stop();}
}
  • Scala代码实现:
package com.yichenkeji.demo.sparkscalaimport org.apache.spark.sql.SparkSessionobject SparkSqlDemo {def main(args: Array[String]): Unit = {val spark = SparkSession.builder().master("local").appName("Spark SQL Demo")
//      .config("spark.some.config.option", "some-value").getOrCreate()//读取CSV文件val df1 = spark.read.option("header", "true") //是否有表头.option("delimiter", ";") //分隔符.csv("F:\\24\\spark\\data\\people.csv")df1.show// 创建临时视图df1.createOrReplaceTempView("people")// 创建全局临时视图df1.createGlobalTempView("people")//使用临时视图spark.sql("SELECT * FROM people").show()//+-----+---+---------+//| name|age|      job|//+-----+---+---------+//|Jorge| 30|Developer|//|  Bob| 32|Developer|//+-----+---+---------+// 全局临时视图保存在global_temp数据库中,使用全局临时视图时需要全路径访问,如:global_temp.peoplespark.sql("SELECT name,age,job FROM global_temp.people where age > 30").show()//+-----+---+---------+//| name|age|      job|//+-----+---+---------+//|  Bob| 32|Developer|//+-----+---+---------+spark.stop}}

4.2 DSL 语法

        DataFrame DataFrame为Scala、Java、Python和R提供了针对结构化数据操作的领域特定语言。使用 DSL 语法不必创建临时视图。

  • Java代码实现:
package com.yichenkeji.demo.sparkjava;import org.apache.spark.sql.*;import static org.apache.spark.sql.functions.col;
public class SparkSqlDSLDemo {public static void main(String[] args) throws AnalysisException {SparkSession spark = SparkSession.builder().master("local").appName("Spark SQL DSL")
//                .config("spark.some.config.option", "some-value").getOrCreate();//读取CSV文件:CSV带有表头Dataset<Row> df1 = spark.read().option("header", "true")//设置是否有表头.option("delimiter", ";") //设置分隔符,默认是逗号.csv("F:\\24\\spark\\data\\people.csv");df1.show();// 打印字段信息df1.printSchema();
//		root
//		 |-- name: string (nullable = true)
//		 |-- age: string (nullable = true)
//		 |-- job: string (nullable = true)//查询指定字段df1.select("name","age","job").show();//+-----+---+---------+//| name|age|      job|//+-----+---+---------+//|Jorge| 30|Developer|//|  Bob| 32|Developer|//+-----+---+---------+//查询指定字段并设置别名,对查询的字段进行运算df1.select(col("name").alias("name"),col("age").plus(1).alias("age"),col("job")).show();//+-----+---+---------+//| name|age|      job|//+-----+---+---------+//|Jorge| 31|Developer|//|  Bob| 33|Developer|//+-----+---+---------+//过滤数据df1.filter(col("age").gt(30)).show();
//        df1.where(col("age").gt(30)).show();//+-----+---+---------+//| name|age|      job|//+-----+---+---------+//|  Bob| 32|Developer|//+-----+---+---------+//分组聚合df1.groupBy("job").count().show();//+---------+-----+//|      job|count|//+---------+-----+//|Developer|    2|//+---------+-----+//复杂聚合df1.groupBy(col("job").alias("post")).agg(functions.count(col("name")).as("nums"),functions.sum(col("age")).as("total_age"),functions.avg(col("age")).as("aver_age")).show();//+---------+----+---------+--------+//|     post|nums|total_age|aver_age|//+---------+----+---------+--------+//|Developer|   2|     62.0|    31.0|//+---------+----+---------+--------+spark.stop();}
}
  • Scala代码实现:
package com.yichenkeji.demo.sparkscalaimport org.apache.spark.sql.{SparkSession, functions}
import org.apache.spark.sql.functions.colobject SparkSqlDSLDemo {def main(args: Array[String]): Unit = {val spark = SparkSession.builder().master("local").appName("Spark SQL DSL")
//      .config("spark.some.config.option", "some-value").getOrCreate()//读取CSV文件val df1 = spark.read.option("header", "true") //是否有表头.option("delimiter", ";") //分隔符.csv("F:\\24\\spark\\data\\people.csv")df1.show//打印字段信息df1.printSchema//		root//		 |-- name: string (nullable = true)//		 |-- age: string (nullable = true)//		 |-- job: string (nullable = true)//查询指定字段df1.select("name", "age", "job").show//+-----+---+---------+//| name|age|      job|//+-----+---+---------+//|Jorge| 30|Developer|//|  Bob| 32|Developer|//+-----+---+---------+//查询指定字段并设置别名,对查询的字段进行运算import spark.implicits._df1.select($"name" as "name", ($"age" + 1) as "age", $"job" as "job").show//+-----+---+---------+//| name|age|      job|//+-----+---+---------+//|Jorge| 31|Developer|//|  Bob| 33|Developer|//+-----+---+---------+//过滤数据df1.filter($"age" > 30).show
//    df1.where($"age" > 30).show//+-----+---+---------+//| name|age|      job|//+-----+---+---------+//|  Bob| 32|Developer|//+-----+---+---------+//分组聚合df1.groupBy("job").count.show//+---------+-----+//|      job|count|//+---------+-----+//|Developer|    2|//+---------+-----+//复杂聚合df1.groupBy(col("job").alias("post")).agg(functions.count(col("name")).as("nums"), functions.sum(col("age")).as("total_age"), functions.avg(col("age")).as("aver_age")).show()//+---------+----+---------+--------+//|     post|nums|total_age|aver_age|//+---------+----+---------+--------+//|Developer|   2|     62.0|    31.0|//+---------+----+---------+--------+spark.stop}}

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

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

相关文章

备份和恢复Linux服务器上的HTTP配置

备份和恢复Linux服务器上的HTTP配置是一项重要的任务&#xff0c;它可以确保您的服务器在出现故障或配置错误时能够迅速恢复正常运行。下面我们将介绍如何备份和恢复Linux服务器上的HTTP配置。 备份HTTP配置 登录到Linux服务器上&#xff0c;并使用root权限。 备份HTTP配置文…

分部积分法

1.形式&#xff1a;u对v求积分uv-v对u求积分&#xff0c;一前一后&#xff0c;一般把三角函数&#xff0c;反三角函数&#xff0c;In,e的x次方提到d里面 2. 3. 4. 5. 6. 7. 当结果中出现要求的不要慌&#xff0c;不是1直接求&#xff0c;是1重新计算

一体化污水处理设备材质怎么选

在环保意识日益增强的今天&#xff0c;污水处理设备成为城市建设过程中的重要环节。而选择合适的一体化污水处理设备材质&#xff0c;则成为了一项重要的决策。本文将从专业的角度出发&#xff0c;为您解析一体化污水处理设备材质的选取。 首先&#xff0c;一体化污水处理设备材…

postman常用脚本

在参数中动态添加开始时间和结束时间的时间戳 1.先在collection中添加参数&#xff0c;这里的作用域是collection&#xff0c;也可以是其他的任何scope 2.在Pre-request Script 中设定开始时间和结束时间参数&#xff0c;比如昨天和今天的时间戳&#xff0c;下面是js代码 con…

Android Studio Hedgehog | 2023.1.1(刺猬)

Android Gradle 插件和 Android Studio 兼容性 Android Studio 构建系统基于 Gradle&#xff0c;并且 Android Gradle 插件 (AGP) 添加了一些特定于构建 Android 应用程序的功能。下表列出了每个版本的 Android Studio 所需的 AGP 版本。 Android Studio versionRequired AG…

Kubernetes 常用命令

集群信息&#xff1a; 1. 显示 Kubernetes 版本&#xff1a;kubectl version2. 显示集群信息&#xff1a;kubectl cluster-info3. 列出集群中的所有节点&#xff1a;kubectl get nodes4. 查看一个具体的节点详情&#xff1a;kubectl describe node <node-name>5. 列出所…

python学习:opencv+用鼠标画矩形和圆形

目录 步骤 定义数据 新建一个窗口黑色画布 显示黑色画布 添加鼠标回调函数 循环 一直显示图片 一直判断有没有按下字母 m 关闭所有窗口 鼠标回调函数 步骤 当鼠标按下记录坐标并记录鼠标标记位为true&#xff0c;移动的时候就会不断的画矩形或者圆&#xff0c;松下的时候就再…

vue项目通过宝塔部署之后,页面刷新后浏览器404页面

转载&#xff1a;vue项目通过宝塔部署之后&#xff0c;页面刷新后浏览器404页面。

ioc循环依赖怎么解决

在使用IoC&#xff08;Inversion of Control&#xff09;容器时&#xff0c;循环依赖是一个常见的问题。不同的IoC容器提供了不同的解决方案。在Spring框架中&#xff0c;常用的解决循环依赖的注解是 Lazy 和 Autowired。 1.Lazy 注解&#xff1a; 在Spring中&#xff0c;Lazy…

STM32F1中断NVIC

目录 1. 中断系统 2. 中断向量表 3. NVIC基本结构 4. NVIC优先级分组 5. NVIC程序编写 5.1 中断分组 5.2 中断结构体变量 5.3 中断通道选择 5.4 抢占优先级和响应优先级配置 6. 中断程序执行 1. 中断系统 中断&#xff1a;在主程序运行过程中&#xff0…

如何设计自动化测试脚本

企业中如何设计自动化测试脚本呢&#xff1f;今天我们就来为大家分享一些干货。 一、线性设计 线性脚本设计方式是以脚本的方式体现测试用例&#xff0c;是一种非结构化的编码方式&#xff0c;多数采用录制回放的方式&#xff0c;测试工程师通过录制回访的访问对被测系统进行…

基于JSDoc实现TypeScript类型安全的实践报告

在FEDay 2023中我讲了《从JS到TS无缝迁移的实践报告》【视频在这里在这里】&#xff0c;是将一个传统的JS项目&#xff08;mochajs/mocha&#xff09;迁移到TypeScript环境的全程。其中提到了一件事情&#xff0c;就是“可以通过JSDoc/TSDoc来生成.d.ts”&#xff0c;从而实现T…

FastAPI的路由

前言 回想一下我们在hello world程序里面做了哪些事情&#xff1f; 还是先把那段著名的程序的代码贴出来欣赏一下吧。 from fastapi import FastAPIapp FastAPI()app.get("/") async def root():return {"message": "Hello World"}app.get(&q…

mvc模式test2

关于上篇book.java中使用类型不一样导致的报错 是在bookdao.java中解决 bookservlet.java package servlet; import java.io.IOException; import beans.Book; import dao.BookDao; import java.util.ArrayList; import javax.servlet.ServletException; import javax.servl…

RabbitMQ的消息发送和接收机制

所有 MQ 产品从模型抽象上来说都是一样的过程&#xff1a; 消费者&#xff08;consumer&#xff09;订阅某个队列。生产者&#xff08;producer&#xff09;创建消息&#xff0c;然后发布到队列&#xff08;queue&#xff09;中&#xff0c;最后将消息发送到监听的消费者。 上…

C语言 - 字符函数和字符串函数

系列文章目录 文章目录 系列文章目录前言1. 字符分类函数islower 是能够判断参数部分的 c 是否是⼩写字⺟的。 通过返回值来说明是否是⼩写字⺟&#xff0c;如果是⼩写字⺟就返回⾮0的整数&#xff0c;如果不是⼩写字⺟&#xff0c;则返回0。 2. 字符转换函数3. strlen的使⽤和…

20、pytest中的参数化

官方实例 # content of test_expectation.pyimport pytestpytest.mark.parametrize("test_input, expected",[("35",8),("24",6),("6*9",42)]) def test_eval(test_input, expected):assert eval(test_input) expected# content of …

【UE】在场景中或控件蓝图上显示移动的文字

目录 效果 步骤 一、制作含有文字的图片 二、在场景中显示移动的文字 三、在控件蓝图上显示 效果 步骤 一、制作含有文字的图片 打开PS&#xff0c;新建一个宽度为600&#xff0c;高度为50的文档 添加一段文字 保存 二、在场景中显示移动的文字 1. 打开UE编辑器&#x…

error: identifier “__builtin_is_constant_evaluated“ is undefined

如题&#xff0c;配置CUDA相关编译报错如下&#xff1a; /usr/include/c/9/bits/stl_function.h(437): error: identifier "__builtin_is_constant_evaluated" is undefined 原因&#xff1a;gcc版本过高&#xff0c;当前是gcc-9&#xff0c; 需要降级为gcc-8, 或者…

nodejs+vue+微信小程序+python+PHP在线购票系统的设计与实现-计算机毕业设计推荐

伴随着信息时代的到来&#xff0c;以及不断发展起来的微电子技术&#xff0c;这些都为在线购票带来了很好的发展条件。同时&#xff0c;在线购票的范围不断增大&#xff0c;这就需要有一种既能使用又能使用的、便于使用的、便于使用的系统来对其进行管理。在目前这种大环境下&a…