通过 Spark SQL 和 DataFrame 操作表和多种内部数据源总结

文章目录

    • 前言
    • 在Spark应用中使用Spark SQL
    • SQL 表和视图
      • 内部表和外部表
      • 创建库和表
      • 创建视图
      • 查看元数据
      • 表缓存
      • 读取表数据
    • 表和 DataFrame 的数据来源
      • DataFrameReader
      • DataFrameWriter
      • Parquet
      • JSON
      • CSV
      • Avro
      • ORC
      • Images
      • Binary Files
    • 总结

前言

本文将探讨 Spark 中 Spark SQL 接口是如何与其他外部组件交互的。下边列出了一些 Spark SQL 的能力:

  • 为 Spark 上层结构化 API (DataSet, DataFram)提供查询引擎
  • 可以读写各种结构化格式的数据(如JSON、Hive表、Parquet、Avro、ORC、CSV)。
  • 允许我们使用JDBC/ODBC连接器从外部商业智能(BI)数据源(如Tableau, Power BI, Talend)或rdbms(如MySQL和PostgreSQL)查询数据。
  • 提供一个编程接口,用于与数据库中存储为表或视图的结构化数据进行交互
  • 提供一个交互式shell,用于对结构化数据发出SQL查询。

image.png

在Spark应用中使用Spark SQL

Spark 2.0 后可以通过实例化一个 SparkSession来执行 sql, 实例化完返回一个DataFram

# In Python
from pyspark.sql import SparkSession        
# Create a SparkSession
spark = (SparkSession.builder.appName("SparkSQLExampleApp").getOrCreate())# Path to data set
csv_file = "/databricks-datasets/learning-spark-v2/flights/departuredelays.csv"# Read and create a temporary view
# Infer schema (note that for larger files you 
# may want to specify the schema)
df = (spark.read.format("csv").option("inferSchema", "true").option("header", "true").load(csv_file))
df.createOrReplaceTempView("us_delay_flights_tbl")

现在我们有了一个临时视图,可以使用Spark SQL发出SQL查询:

spark.sql("""SELECT distance, origin, destination 
FROM us_delay_flights_tbl WHERE distance > 1000 
ORDER BY distance DESC""").show(10)+--------+------+-----------+
|distance|origin|destination|
+--------+------+-----------+
|4330    |HNL   |JFK        |
|4330    |HNL   |JFK        |
|4330    |HNL   |JFK        |
|4330    |HNL   |JFK        |
|4330    |HNL   |JFK        |
|4330    |HNL   |JFK        |
|4330    |HNL   |JFK        |
|4330    |HNL   |JFK        |
|4330    |HNL   |JFK        |
|4330    |HNL   |JFK        |
+--------+------+-----------+
only showing top 10 rows

上边的 sql 查询也可以转换为使用 DataFrame 查询:

# In Python
from pyspark.sql.functions import col, desc
(df.select("distance", "origin", "destination").where(col("distance") > 1000).orderBy(desc("distance"))).show(10)# Or
(df.select("distance", "origin", "destination").where("distance > 1000").orderBy("distance", ascending=False).show(10))

SQL 表和视图

表保存数据。与Spark中的每个表相关联的是它的相关元数据,这些元数据是关于表及其数据的元信息:schema、描述、表名、数据库名、列名、分区、实际数据所在的物理位置等。所有这些都存储在中心 metastore 中。
默认情况下,Spark使用Apache Hive metastore(位于/user/ Hive /warehouse)来持久化关于表的所有元数据,而不是为Spark表提供单独的metastore。但是,可以通过将Spark配置变量spark.sql.warehouse.dir设置为另一个位置来更改默认位置,该位置可以设置为本地或外部分布式存储。

内部表和外部表

Spark允许创建两种类型的表: 内部表和外部表。对于内部表,Spark同时管理元数据和文件存储中的数据。内部表可以是本地文件系统、HDFS或对象存储(如Amazon S3或Azure Blob)。对于外部表,Spark只管理元数据,具体的数据保存在外部存储中。
对于内部表,由于Spark管理所有内容,因此像DROP table table_name这样的SQL命令可以同时删除元数据和数据。对于外部表,相同的命令将只删除元数据,而不删除实际数据。

创建库和表

创建库

// In Scala/Python
spark.sql("CREATE DATABASE learn_spark_db")
spark.sql("USE learn_spark_db")

创建内部表

// In Scala/Python
spark.sql("CREATE TABLE managed_us_delay_flights_tbl (date STRING, delay INT,  distance INT, origin STRING, destination STRING)")

也可以通过 DataFrame API 创建:

# In Python
# Path to our US flight delays CSV file 
csv_file = "/databricks-datasets/learning-spark-v2/flights/departuredelays.csv"
# Schema as defined in the preceding example
schema="date STRING, delay INT, distance INT, origin STRING, destination STRING"
flights_df = spark.read.csv(csv_file, schema=schema)
flights_df.write.saveAsTable("managed_us_delay_flights_tbl")

创建外部表
可以将外部已有数据源作为外部表,支持 Parquet, CSV, or JSON 格式, 下边是使用 CSV 作为外部表的例子:

spark.sql("""CREATE TABLE us_delay_flights_tbl(date STRING, delay INT, distance INT, origin STRING, destination STRING) USING csv OPTIONS (PATH '/databricks-datasets/learning-spark-v2/flights/departuredelays.csv')""")

通过 API 创建:

(flights_df.write.option("path", "/tmp/data/us_flights_delay").saveAsTable("us_delay_flights_tbl"))

创建视图

视图是一个虚拟表,只包含查询结果,不会持久化数据。Spark 的视图分为临时视图和全局临时视图。
临时视图只能在当前 session 中查询,全局临时视图可以在全局 session 中生效。
创建全局临时视图
通过 SQL 创建

-- In SQL
CREATE OR REPLACE GLOBAL TEMP VIEW us_origin_airport_SFO_global_tmp_view ASSELECT date, delay, origin, destination from us_delay_flights_tbl WHERE origin = 'SFO';CREATE OR REPLACE TEMP VIEW us_origin_airport_JFK_tmp_view ASSELECT date, delay, origin, destination from us_delay_flights_tbl WHERE origin = 'JFK'

通过 API 创建

# In Python
df_sfo = spark.sql("SELECT date, delay, origin, destination FROM us_delay_flights_tbl WHERE origin = 'SFO'")
df_jfk = spark.sql("SELECT date, delay, origin, destination FROM us_delay_flights_tbl WHERE origin = 'JFK'")# Create a temporary and global temporary view
df_sfo.createOrReplaceGlobalTempView("us_origin_airport_SFO_global_tmp_view")
df_jfk.createOrReplaceTempView("us_origin_airport_JFK_tmp_view")

使用视图
创建完全局临时视图后,可以通过global_temp.<view_name>的方式访问视图:

-- In SQL 
SELECT * FROM global_temp.us_origin_airport_SFO_global_tmp_view
// In Scala/Python
spark.read.table("us_origin_airport_JFK_tmp_view")
// Or
spark.sql("SELECT * FROM us_origin_airport_JFK_tmp_view")

删除视图

-- In SQL
DROP VIEW IF EXISTS us_origin_airport_SFO_global_tmp_view;
DROP VIEW IF EXISTS us_origin_airport_JFK_tmp_view
// In Scala/Python
spark.catalog.dropGlobalTempView("us_origin_airport_SFO_global_tmp_view")
spark.catalog.dropTempView("us_origin_airport_JFK_tmp_view")

查看元数据

在 Spark 中,元数据 Catalog 是一个用于管理和维护数据源、表、视图等元数据信息的组件。它允许用户查询、浏览和操作存储在 Spark 中的数据结构和元数据信息。元数据 Catalog 提供了一个统一的接口,使用户可以通过编程方式访问和操作元数据,而无需直接操作底层的数据存储。
Spark 提供了两种类型的元数据 Catalog:Hive 元数据 Catalog 和 In-Memory 元数据 Catalog。

Hive 元数据 Catalog
Hive 元数据 Catalog 是 Spark 的默认元数据存储和管理系统,它允许 Spark 与 Hive 集成,并使用 Hive 元数据存储和元数据服务。通过 Hive 元数据 Catalog,Spark 可以读取和写入 Hive 表、视图和分区,并执行 Hive 兼容的 SQL 查询。

In-Memory 元数据 Catalog
In-Memory 元数据 Catalog 是 Spark 2.0 引入的新特性,它是一个轻量级的元数据存储系统,将元数据信息存储在 Spark 的内存中,不依赖于外部的元数据存储系统。In-Memory 元数据 Catalog 支持创建、查询、删除临时视图、全局临时视图、数据源表等操作,但不支持持久化的表或分区。

查询元数据

// In Scala/Python
spark.catalog.listDatabases()
spark.catalog.listTables()
spark.catalog.listColumns("us_delay_flights_tbl")

表缓存

在 Spark 中,通过缓存表(Cache Table)可以将数据缓存在内存中,以提高查询性能。缓存表可以加快对数据的访问速度,减少重复计算,特别是当数据需要被频繁地查询或者被多次使用时。
在 Spark 中,可以通过以下方式将表缓存到内存中:

# 使用 SQL
spark.sql("CACHE TABLE table_name")
# 使用 API
df.cache()

这会将指定的表缓存到内存中,以供后续查询使用。

读取表数据

将外部表的数据读取生成 DataFrame。

// In Scala
val usFlightsDF = spark.sql("SELECT * FROM us_delay_flights_tbl")
val usFlightsDF2 = spark.table("us_delay_flights_tbl")
# In Python
us_flights_df = spark.sql("SELECT * FROM us_delay_flights_tbl")
us_flights_df2 = spark.table("us_delay_flights_tbl")

表和 DataFrame 的数据来源

DataFrameReader

使用方式如下:

DataFrameReader.format(args).option("key", "value").schema(args).load()

只能通过SparkSession实例访问DataFrameReader:

SparkSession.read 
// or 
SparkSession.readStream

read读取静态数据源,readStream读取动态数据源。
DataFrameReader API 的参数说明如下:

方法参数说明
format()"parquet", "csv", "txt", "json", "jdbc", "orc", "avro", 等如果不指定此方法,则默认为Parquet或spark.sql.sources.default中设置的任何方法
option()(“mode”, {PERMISSIVE | FAILFAST | DROPMALFORMED } )
(“inferSchema”, {true | false})
(“path”, “path_file_data_source”)
一系列键/值对和选项。
Spark文档展示了一些示例,并解释了不同的schema及其操作。默认schema 为“permit”。“interschema”和“mode”选项是特定于JSON和CSV文件格式的。
schema()DDL String or StructType, e.g., ‘A INT, B STRING’ or
StructType(…)
对于JSON或CSV格式,可以在option()方法中指定推断schema。通常,为任何格式提供schema都可以加快加载速度,并确保数据符合预期的schema。
load()“/path/to/data/source”数据源的路径。如果在option(“path”, “…”)中指定,则可以为空。

下边是一些使用案例:

// In Scala
// Use Parquet 
val file = """/databricks-datasets/learning-spark-v2/flights/summary-data/parquet/2010-summary.parquet"""
val df = spark.read.format("parquet").load(file) 
// Use Parquet; you can omit format("parquet") if you wish as it's the default
val df2 = spark.read.load(file)
// Use CSV
val df3 = spark.read.format("csv").option("inferSchema", "true").option("header", "true").option("mode", "PERMISSIVE").load("/databricks-datasets/learning-spark-v2/flights/summary-data/csv/*")
// Use JSON
val df4 = spark.read.format("json").load("/databricks-datasets/learning-spark-v2/flights/summary-data/json/*")

DataFrameWriter

DataFrameWriter 将数据保存或写入指定的内置数据源。

DataFrameWriter.format(args).option(args).bucketBy(args).partitionBy(args).save(path)DataFrameWriter.format(args).option(args).sortBy(args).saveAsTable(table)

方法和参数说明:

方法参数说明
format()“parquet”, “csv”, “txt”, “json”, “jdbc”, “orc”, “avro”, etc.如果不指定此方法,则默认为Parquet或spark.sql.sources.default中设置的任何方法。
option()(“mode”, {append | overwrite | ignore | error or errorifexists} )
(“mode”, {SaveMode.Overwrite | SaveMode.Append, SaveMode.Ignore, SaveMode.ErrorIfExists})
(“path”, “path_to_write_to”)
一系列键/值对和选项。Spark文档展示了一些示例。这是一个重载方法。默认模式选项是error或errorifexists和SaveMode.ErrorIfExists;如果数据已经存在,它们会在运行时抛出异常。
bucketBy()(numBuckets, col, col…, coln)桶的数量和要桶的列的名称。在文件系统上使用Hive的bucket方案。
save()“/path/to/data/source”保存路径。如果在option(“path”, “…”)中指定,则可以为空
saveAsTable()“table_name”保存到的表。

使用案例:

// In Scala
// Use JSON
val location = ... 
df.write.format("json").mode("overwrite").save(location)

Parquet

它是Spark中的默认数据源,建议在转换和清理数据之后,将dataframe保存为Parquet格式,以供下游使用。
读取 Parquet 文件生成 DataFrame

// In Scala
val file = """/databricks-datasets/learning-spark-v2/flights/summary-data/parquet/2010-summary.parquet/"""
val df = spark.read.format("parquet").load(file)
# In Python
file = """/databricks-datasets/learning-spark-v2/flights/summary-data/parquet/2010-summary.parquet/"""
df = spark.read.format("parquet").load(file)

读取 Parquet 文件创建表

-- In SQL
CREATE OR REPLACE TEMPORARY VIEW us_delay_flights_tblUSING parquetOPTIONS (path "/databricks-datasets/learning-spark-v2/flights/summary-data/parquet/2010-summary.parquet/" )

将 DataFrames 保存为 Parquet 文件

// In Scala
df.write.format("parquet")
.mode("overwrite")
.option("compression", "snappy")
.save("/tmp/data/parquet/df_parquet")
# In Python
(df.write.format("parquet").mode("overwrite").option("compression", "snappy").save("/tmp/data/parquet/df_parquet"))

Parquet是默认的文件格式, 即使不指定 format()方法,DataFrame仍将保存为Parquet文件。
将 DataFrames 保存为内部表

// In Scala
df.write
.mode("overwrite")
.saveAsTable("us_delay_flights_tbl")s
# In Python
(df.write.mode("overwrite").saveAsTable("us_delay_flights_tbl"))

JSON

读取 JSON 文件创建 DataFrame

// In Scala
val file = "/databricks-datasets/learning-spark-v2/flights/summary-data/json/*"
val df = spark.read.format("json").load(file)
# In Python
file = "/databricks-datasets/learning-spark-v2/flights/summary-data/json/*"
df = spark.read.format("json").load(file)

读取 JSON 文件创建表

-- In SQL
CREATE OR REPLACE TEMPORARY VIEW us_delay_flights_tblUSING jsonOPTIONS (path  "/databricks-datasets/learning-spark-v2/flights/summary-data/json/*")

将 DataFrame 保存为 JSON 文件

// In Scala
df.write.format("json")
.mode("overwrite")
.option("compression", "snappy")
.save("/tmp/data/json/df_json")
# In Python
(df.write.format("json").mode("overwrite").option("compression", "snappy").save("/tmp/data/json/df_json"))

CSV

读取 CSV 文件创建 DataFrame

// In Scala
val file = "/databricks-datasets/learning-spark-v2/flights/summary-data/csv/*"
val schema = "DEST_COUNTRY_NAME STRING, ORIGIN_COUNTRY_NAME STRING, count INT"val df = spark.read.format("csv")
.schema(schema)
.option("header", "true")
.option("mode", "FAILFAST")     // Exit if any errors
.option("nullValue", "")        // Replace any null data with quotes
.load(file)
# In Python
file = "/databricks-datasets/learning-spark-v2/flights/summary-data/csv/*"
schema = "DEST_COUNTRY_NAME STRING, ORIGIN_COUNTRY_NAME STRING, count INT"
df = (spark.read.format("csv").option("header", "true").schema(schema).option("mode", "FAILFAST")  # Exit if any errors.option("nullValue", "")     # Replace any null data field with quotes.load(file))

读取 CSV 文件创建表

-- In SQL
CREATE OR REPLACE TEMPORARY VIEW us_delay_flights_tblUSING csvOPTIONS (path "/databricks-datasets/learning-spark-v2/flights/summary-data/csv/*",header "true",inferSchema "true",mode "FAILFAST")s

将 DataFrame 保存为 CSV 文件

// In Scala
df.write.format("csv").mode("overwrite").save("/tmp/data/csv/df_csv")
# In Python
df.write.format("csv").mode("overwrite").save("/tmp/data/csv/df_csv")

Avro

读取 Avro 文件生成 DataFrame

// In Scala
val df = spark.read.format("avro")
.load("/databricks-datasets/learning-spark-v2/flights/summary-data/avro/*")
df.show(false)
# In Python
df = (spark.read.format("avro").load("/databricks-datasets/learning-spark-v2/flights/summary-data/avro/*"))
df.show(truncate=False)+-----------------+-------------------+-----+
|DEST_COUNTRY_NAME|ORIGIN_COUNTRY_NAME|count|
+-----------------+-------------------+-----+
|United States    |Romania            |1    |
|United States    |Ireland            |264  |
|United States    |India              |69   |
|Egypt            |United States      |24   ||Equatorial Guinea|United States      |1    ||United States    |Singapore          |25   ||United States    |Grenada            |54   ||Costa Rica       |United States      |477  ||Senegal          |United States      |29   ||United States    |Marshall Islands   |44   |+-----------------+-------------------+-----+only showing top 10 rows

读取 Avro 文件创建表

-- In SQL 
CREATE OR REPLACE TEMPORARY VIEW episode_tblUSING avroOPTIONS (path "/databricks-datasets/learning-spark-v2/flights/summary-data/avro/*")

保存 DataFrame 为 Avro 文件

// In Scala
df.write
.format("avro")
.mode("overwrite")
.save("/tmp/data/avro/df_avro")
# In Python
(df.write.format("avro").mode("overwrite").save("/tmp/data/avro/df_avro"))

ORC

读取 ORC 文件生成 DataFrame

// In Scala 
val file = "/databricks-datasets/learning-spark-v2/flights/summary-data/orc/*"
val df = spark.read.format("orc").load(file)
df.show(10, false)
# In Python
file = "/databricks-datasets/learning-spark-v2/flights/summary-data/orc/*"
df = spark.read.format("orc").option("path", file).load()
df.show(10, False)

读取 ORC 文件创建表

-- In SQL
CREATE OR REPLACE TEMPORARY VIEW us_delay_flights_tblUSING orcOPTIONS (path "/databricks-datasets/learning-spark-v2/flights/summary-data/orc/*")

保存 DataFrame 为 ORC 文件

// In Scala
df.write.format("orc")
.mode("overwrite")
.option("compression", "snappy")
.save("/tmp/data/orc/df_orc")
# In Python
(df.write.format("orc").mode("overwrite").option("compression", "snappy").save("/tmp/data/orc/flights_orc"))

Images

读取图片生成 DataFrame

// In Scala
import org.apache.spark.ml.source.imageval imageDir = "/databricks-datasets/learning-spark-v2/cctvVideos/train_images/"
val imagesDF = spark.read.format("image").load(imageDir)imagesDF.printSchemaimagesDF.select("image.height", "image.width", "image.nChannels", "image.mode", "label").show(5, false)
# In Python
from pyspark.ml import imageimage_dir = "/databricks-datasets/learning-spark-v2/cctvVideos/train_images/"
images_df = spark.read.format("image").load(image_dir)
images_df.printSchema()root|-- image: struct (nullable = true)|    |-- origin: string (nullable = true)|    |-- height: integer (nullable = true)|    |-- width: integer (nullable = true)|    |-- nChannels: integer (nullable = true)|    |-- mode: integer (nullable = true)|    |-- data: binary (nullable = true)|-- label: integer (nullable = true)images_df.select("image.height", "image.width", "image.nChannels", "image.mode", "label").show(5, truncate=False)+------+-----+---------+----+-----+
|height|width|nChannels|mode|label|
+------+-----+---------+----+-----+
|288   |384  |3        |16  |0    |
|288   |384  |3        |16  |1    |
|288   |384  |3        |16  |0    |
|288   |384  |3        |16  |0    |
|288   |384  |3        |16  |0    |
+------+-----+---------+----+-----+
only showing top 5 rows

Binary Files

读取二进制文件生成 DataFrame

// In Scala
val path = "/databricks-datasets/learning-spark-v2/cctvVideos/train_images/"
val binaryFilesDF = spark.read.format("binaryFile")
.option("pathGlobFilter", "*.jpg")
.load(path)
binaryFilesDF.show(5)
# In Python
path = "/databricks-datasets/learning-spark-v2/cctvVideos/train_images/"
binary_files_df = (spark.read.format("binaryFile").option("pathGlobFilter", "*.jpg").load(path))
binary_files_df.show(5)+--------------------+-------------------+------+--------------------+-----+
|                path|   modificationTime|length|             content|label|
+--------------------+-------------------+------+--------------------+-----+
|file:/Users/jules...|2020-02-12 12:04:24| 55037|[FF D8 FF E0 00 1...|    0|
|file:/Users/jules...|2020-02-12 12:04:24| 54634|[FF D8 FF E0 00 1...|    1|
|file:/Users/jules...|2020-02-12 12:04:24| 54624|[FF D8 FF E0 00 1...|    0|
|file:/Users/jules...|2020-02-12 12:04:24| 54505|[FF D8 FF E0 00 1...|    0|
|file:/Users/jules...|2020-02-12 12:04:24| 54475|[FF D8 FF E0 00 1...|    0|
+--------------------+-------------------+------+--------------------+-----+
only showing top 5 rows

通过设置 recursiveFileLookuptrue, 可以不指定文件路劲递归读取文件:

// In Scala
val binaryFilesDF = spark.read.format("binaryFile")
.option("pathGlobFilter", "*.jpg")
.option("recursiveFileLookup", "true")
.load(path)
binaryFilesDF.show(5)

总结

探本文主要总结了 DataFrame API和Spark SQL之间的交互,并且总结了我们能够通过 Spark SQL 做什么:

  • 使用Spark SQL和DataFrame API创建内部表和外部表。
  • 读取和写入各种内置数据源和文件格式。
  • 通过 spark.sql接口对存储为Spark sql表或视图的结构化数据进行 sql 查询。
  • 通过 Catalog查询表和视图的元信息。
  • 使用 DataFrameWriterDataFrameReader API。

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

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

相关文章

StockTrading AI小模型股票自动交易系统 转载

Stock-Trading StockTrading AI小模型股票自动交易系统 项目文档 Stock-Trading 语雀 项目展示 功能介绍 对接证券平台&#xff0c;实现股票自动化交易使用QuartZ定时任务调度&#xff0c;每日自动更新数据使用DL4J框架实现LSTM模型指导股票买入&#xff0c;采用T1短线交易策…

C/C++如何快速学习?少走3年弯路

于我而言&#xff0c;最开始学习就是 C&#xff0c;除了计算机专业&#xff0c;其他专业可能学习的第一门编程语言为 C 语言&#xff0c;还是谭浩强爷爷那本&#xff0c;当时想着有点 C 基础&#xff0c;无外乎就是 C 语言的升级版&#xff0c;于是开启了 C 的路程。 语言这个…

鸿蒙、如何使用@ohos.contact 接口,实现对联系人的增删查改功能

介绍 本示例使用ohos.contact 接口&#xff0c;实现了对联系人的增删查改功能。 效果预览 使用说明 1.点击 按钮&#xff0c;跳转添加联系人界面&#xff0c;输入联系人信息&#xff0c;点击 √&#xff0c;确认添加联系人&#xff0c;并返回首页&#xff1b; 2.点击联系人…

学习记录14-运算放大器2

目录 前言 一、理想放大器 二、虚断 二、虚短 虚短的两个使用条件 1.虚短概念 2.如果我们将运放的同相端和反相端颠倒会怎样呢&#xff1f; 总结 前言 主要讲述运算放大器的虚短虚断 一、理想放大器 如果没有基础或只是想简单了解&#xff0c;可以看我前一篇文章&am…

Jackson 2.x 系列【15】序列化器 JsonSerializer

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 概述2. 方法2.1 构造2.2 序列化2.3 其他 3. 实现类3.1 StdSerializer3.1.1 源…

vue3学习笔记(pinia)

defineModel&#xff1a;快速实现组件的双向绑定 pinia&#xff1a;在仓库中提供数据和使用数据 创建store文件夹&#xff0c;在里面创建counter.js&#xff0c;以提供数据&#xff0c;注意需要return 和 export&#xff0c;export的是一个函数。 import { defineStore } from…

智慧驿站式的“智慧公厕”,给城市新基建带来新变化

随着智慧城市建设的推进&#xff0c;智慧驿站作为一种多功能城市部件&#xff0c;正逐渐在城市中崭露头角。这些智慧驿站集合了智慧公厕的管理功能&#xff0c;为城市的新基建带来了全新的变革。本文以智慧驿站智慧公厕源头实力厂家广州中期科技有限公司&#xff0c;大量精品案…

蓝桥杯第十三届省赛C++B组(未完)

目录 刷题统计 修剪灌木 X进制减法 【前缀和双指针】统计子矩阵 【DP】积木画 【图DFS】扫雷 李白打酒加强版 DFS (通过64%&#xff0c;ACwing 3/11&#xff09;; DFS(AC) DP&#xff08;AC&#xff09; 砍竹子(X) 刷题统计 题目描述 小明决定从下周一开始努力刷题准…

基于JAVA的汽车售票网站论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对汽车售票信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差…

ChatGPT与生成式AI:教育领域内新的浪潮与挑战

随着ChatGPT和其他生成式AI技术&#xff0c;如GPT-3.5、GPT-4的出现&#xff0c;我们正见证教育领域一场前所未有的变革浪潮。这些技术不仅推动了教育方式的进步&#xff0c;也为学习者带来了全新的机遇和挑战。 NO.1教育变革的新浪潮 生成式AI技术&#xff0c;特别是ChatGPT&…

使用SquareLine Studio创建LVGL项目到IMX6uLL平台

文章目录 前言一、SquareLine Studio是什么&#xff1f;二、下载安装三、工程配置四、交叉编译 前言 遇到的问题&#xff1a;#error LV_COLOR_DEPTH should be 16bit to match SquareLine Studios settings&#xff0c;解决方法见# 四、交叉编译 一、SquareLine Studio是什么…

04 Python进阶:MySQL-PyMySQL

什么是 PyMySQL&#xff1f; PyMySQL 是一个用于 Python 的纯 Python MySQL 客户端库&#xff0c;提供了与 MySQL 数据库进行交互的功能。PyMySQL 允许 Python 开发人员连接到 MySQL 数据库服务器&#xff0c;并执行诸如查询、插入、更新和删除等数据库操作。 以下是 PyMySQL …

超图SuperMap-Cesium,地形图层,可以渲染一个或多个地形(地形可缓存DEM,TIN方式),webGL代码开发(2024-04-08)

1、缓存文件类型TIN格式&#xff0c;TIN的地形sct只能加一个 const viewer new Cesium.Viewer(cesiumContainer); viewer.terrainProvider new Cesium.CesiumTerrainProvider({isSct: true, // 是否为iServer发布的TIN地形服务,stk地形设置为falserequestWaterMask : true,…

【前沿模型解析】潜在扩散模型 2-2 | 手撕感知图像压缩基础块上下sample块

文章目录 1 DownSample下采样部分1.1 两种实现方式1.2 代码实现 2 UpSample上采样部分2.1 代码实现 1 DownSample下采样部分 1.1 两种实现方式 下采样&#xff0c;即改变特征图的尺寸 下采样的话源码实现了两种方式 方式一&#xff1a;是通过卷积实现下采样&#xff0c;我们…

谈谈什么是 Redis

&#x1f525;博客主页&#xff1a;fly in the sky - CSDN博客 &#x1f680;欢迎各位&#xff1a;点赞&#x1f44d;收藏⭐️留言✍️&#x1f680; &#x1f386;慢品人间烟火色,闲观万事岁月长&#x1f386; &#x1f4d6;希望我写的博客对你有所帮助,如有不足,请指正&#…

Linux(05) Debian 系统修改主机名

查看主机名 方法1&#xff1a;hostname hostname 方法2&#xff1a;cat etc/hostname cat /etc/hostname 如果在创建Linux系统的时候忘记修改主机名&#xff0c;可以采用以下的方式来修改主机名称。 修改主机名 注意&#xff0c;在linux中下划线“_”可能是无效的字符&…

软件测试学习之MySQL学习笔记(完结)

目录 1. 数据库**** 1.1. 概念**** 1.2. 分类**** 1.2.1. 关系型数据库**** 1.2.1.1. SQL**** 1.2.2. 安装**** 1.2.2.1. Navicat**** 2. SQL语句**** 2.1. 常用数据类型**** 2.2. 数据库**** 2.3. 表**** 2.3.1. 字段约束**** 2.4. 数据**** 2.4.1. 增 insert**…

JavaSE:图书管理系统

目录 一、前言 二、内容需求 三、类的设计 &#xff08;一&#xff09;图书类 1.Book 类 2.BookList 类 &#xff08;二&#xff09;操作类 1.添加图书AddOperation类 2.借阅图书BorrowOperation类 3.删除图书DelOperation类 4.显示图书ShowOperation类 5.退出系统Ex…

ChromeOS 中自启动 Fcitx5 和托盘 stalonetray

ChromeOS 更新的飞快&#xff0c;旧文章的方法也老是不好用&#xff0c;找遍了也没找到很好的可以开机自启动 Linux VM 和输入法、托盘的方法。 研究了一下&#xff08;不&#xff0c;是很久&#xff09;&#xff0c;终于找到个丑陋的实现。 方法基于 ChromeOS 123.0.6312.94…

linux 开机自启动

方式1—依赖桌面启动&#xff0c;一般适用与UI相关程序 1、创建运行脚本&#xff0c;以管理员放方式运行&#xff0c;加入密码 vim runapp.sh #!/bin/bash cd /home/nvidia/test echo ‘passcode’ | sudo -S ./testapp 2、终端输入 gnome-session-properties 3、在com…