灌篮少年 发表于 2025-4-18 03:16:18

Spark-SQL

Spark-SQL
一、Spark-SQL核心编程(六)
数据加载与保存:
1、通用方式:
SparkSQL 提供了通用的保存数据和数据加载的方式。这里的通用指的是利用雷同的API,根据不同的参数读取和保存不同格式的数据,SparkSQL 默认读取和保存的文件格式为parquet
 
1.1、加载数据:
spark.read.load 是加载数据的通用方法。如果读取不同格式的数据,可以对不同的数据格式进行设定。
spark.read.format("…")[.option("…")].load("…")
① format("…"):指定加载的数据范例,包罗"csv"、"jdbc"、"json"、"orc"、"parquet"和"textFile"。
② load("…"):在"csv"、"jdbc"、"json"、"orc"、"parquet"和"textFile"格式下需要传入加载数据的路径。
③ option("…"):在"jdbc"格式下需要传入 JDBC 相应参数,url、user、password 和 dbtable
我们前面都是利用 read API 先把文件加载到 DataFrame 然后再查询,其实,我们也可以直接在文件上进行查询: 文件格式.`文件路径`
spark.sql("select * from json.’ Spark-SQL/input/user.json’").show
 
1.2、保存数据:
df.write.save 是保存数据的通用方法。如果保存不同格式的数据,可以对不同的数据格式进行设定。
df.write.format("…")[.option("…")].save("…")
① format("…"):指定保存的数据范例,包罗"csv"、"jdbc"、"json"、"orc"、"parquet"和"textFile"。
② save ("…"):在"csv"、"orc"、"parquet"和"textFile"格式下需要传入保存数据的路径。
③ option("…"):在"jdbc"格式下需要传入 JDBC 相应参数,url、user、password 和 dbtable
 
保存操作可以利用 SaveMode, 用来指明如何处理数据,利用 mode()方法来设置。
https://i-blog.csdnimg.cn/direct/c41a31d1209746e09c8294a5e53173a0.png
例如:df.write.mode("append").json("Spark-SQL/output")
 
2、Parquet
Spark SQL 的默认数据源为 Parquet 格式。Parquet 是一种可以或许有效存储嵌套数据的列式存储格式。数据源为 Parquet 文件时,Spark SQL 可以方便的实行所有的操作,不需要利用 format。修改配置项 spark.sql.sources.default,可修改默认数据源格式。
 
加载数据:
val df = spark.read.load("examples/src/main/resources/users.parquet")
 
保存数据:
var df = spark.read.json("/opt/module/data/input/people.json")
df.write.mode("append").save("/opt/module/data/output")
 
2.1、JSON
Spark SQL 可以或许自动推测 JSON 数据集的结构,并将它加载为一个 Dataset. 可以通过 SparkSession.read.json()去加载 JSON 文件。
注意:Spark 读取的 JSON 文件不是传统的 JSON 文件,每一行都应该是一个 JSON 串
 
加载json文件
val path = "/opt/module/spark-local/people.json" 
val peopleDF = spark.read.json(path)
创建临时表
peopleDF.createOrReplaceTempView("people")
数据查询
val resDF = spark.sql("SELECT name FROM people WHERE age BETWEEN 13 AND 19")
 
2.2、CSV
Spark SQL 可以配置 CSV 文件的列表信息,读取 CSV 文件,CSV 文件的第一行设置为数据列。
spark.read.format("csv").option("sep",";").option("inferSchema","true")
.option("header", "true").load("data/user.csv")
 
2.3、MySQL
Spark SQL 可以通过 JDBC 从关系型数据库中读取数据的方式创建 DataFrame,通过对DataFrame 一系列的计算后,还可以将数据再写回关系型数据库中。
IDEA通过JDBC对MySQL进行操作:
1) 导入依赖
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.27</version>
</dependency>
MySQL8 <version>8.0.11</version>
 
2) 读取数据
val sparkConf = new SparkConf().setMaster("local
[*]").setAppName("SQL")
val spark:SparkSession = SparkSession.builder().config(sparkConf).getOrCreate()
 
import spark.implicits._
//通用的load方式读取
 
spark.read.format("jdbc")
  .option("url","jdbc:mysql://localhost:3306/system")
  .option("driver","com.mysql.jdbc.Driver")//com.mysql.cj.jdbc.Driver
  .option("user","root")
  .option("password","123456")
  .option("dbtable","user")
  .load().show()
 
spark.stop()
 
 
//通用的load方法的另一种情势
spark.read.format("jdbc")
  .options(
    Map("url"->"jdbc:mysql://localhost:3306/system?user=root&password=123456","dbtable"->"user","driver"->"com.mysql.jdbc.Driver"))
  .load().show()
 
 
//通过JDBC
val pros :Properties = new Properties()
pros.setProperty("user","root")
pros.setProperty("password","123456")
val df :DataFrame = spark.read.jdbc("jdbc:mysql://localhost:3306/system","user",pros)
df.show()
 
3) 写入数据
val sparkConf = new SparkConf().setMaster("local
[*]").setAppName("SQL")
val spark:SparkSession = SparkSession.builder().config(sparkConf).getOrCreate()
 
import spark.implicits._
val rdd: RDD = spark.sparkContext.makeRDD(List(Stu("lisi", 20),
  Stu("zs", 30)))
val ds:Dataset = rdd.toDS()
 
ds.write.format("jdbc")
  .option("url","jdbc:mysql://localhost:3306/system")
  .option("driver","com.mysql.jdbc.Driver")
  .option("user","root")
  .option("password","123456")
  .option("dbtable","user2")
  .mode(SaveMode.Append)
  .save()
 
spark.stop()
 
二、Spark-SQL核心编程(七)
Spark-SQL毗连Hive
Apache Hive 是 Hadoop 上的 SQL 引擎,Spark SQL 编译时可以包含 Hive 支持,也可以不包含。包含 Hive 支持的 Spark SQL 可以支持 Hive 表访问、UDF (用户自定义函数)、Hive 查询语言(HQL)等。需要强调的一点是,如果要在 Spark SQL 中包含Hive 的库,并不需要事先安装 Hive。一样平常来说,最好还是在编译 Spark SQL 时引入 Hive支持,如许就可以利用这些特性了。
利用方式分为内嵌Hive、外部Hive、Spark-SQL CLI、Spark beeline 以及代码操作。
 
1、内嵌的 HIVE
如果利用 Spark 内嵌的 Hive, 则什么都不消做, 直接利用即可。但是在现实生产活动当中,几乎没有人去利用内嵌Hive这一模式。
 
2、外部的 HIVE
在虚拟机中下载以下配置文件: https://i-blog.csdnimg.cn/direct/e7306929b7a642a29309baaa4af9f34a.png
如果想在spark-shell中毗连外部已经部署好的 Hive,需要通过以下几个步调:
① Spark 要接管 Hive 需要把 hive-site.xml 拷贝到 conf/目次下,并将url中的localhost改为node01 https://i-blog.csdnimg.cn/direct/d6a413bc69fc464383a7a3eb34317648.pnghttps://i-blog.csdnimg.cn/direct/b9ebfd988bc9428f8ec16df031935696.png
② 把 MySQL 的驱动 copy 到 jars/目次下
 https://i-blog.csdnimg.cn/direct/a41144a66f4c4c389f2a65d62c7afa60.png
③ 把 core-site.xml 和 hdfs-site.xml 拷贝到 conf/目次下
④ 重启 spark-shell https://i-blog.csdnimg.cn/direct/25b9dc2d02b74225ad205309a741ee36.png
https://i-blog.csdnimg.cn/direct/e947db736aad4ba99b5b2e3f2efa2be1.png
3、运行 Spark beeline(了解)
Spark Thrift Server 是 Spark 社区基于 HiveServer2 实现的一个 Thrift 服务。旨在无缝兼容HiveServer2。因为 Spark Thrift Server 的接口和协议都和 HiveServer2 完全一致,因此我们部署好 Spark Thrift Server 后,可以直接利用 hive 的 beeline 访问 Spark Thrift Server 实行相关语句。Spark Thrift Server 的目标也只是代替 HiveServer2,因此它依旧可以和 Hive Metastore进行交互,获取到 hive 的元数据。如果想毗连 Thrift Server,需要通过以下几个步调:
① Spark 要接管 Hive 需要把 hive-site.xml 拷贝到 conf/目次下
② 把 Mysql 的驱动 copy 到 jars/目次下
③ 把 core-site.xml 和 hdfs-site.xml 拷贝到 conf/目次下
④ 启动 Thrift Server
⑤ 利用 beeline 毗连 Thrift Server
beeline -u jdbc:hive2://node01:10000 -n root
 
4、运行Spark-SQL CLI
Spark SQL CLI 可以很方便的在本地运行 Hive 元数据服务以及从命令行实行查询任务。在 Spark 目次下实行如下命令启动 Spark SQL CLI,直接实行 SQL 语句,类似于 Hive 窗口。
操作步调:
① 将mysql的驱动放入jars/当中;
② 将hive-site.xml文件放入conf/当中;
③ 运行bin/目次下的spark-sql.cmd 大概打开cmd,在
D:\spark\spark-3.0.0-bin-hadoop3.2\bin当中直接运行spark-sql https://i-blog.csdnimg.cn/direct/f35064fe015d4537a2d46df88fb0b9e4.png
可以直接运行SQL语句,如下所示:
https://i-blog.csdnimg.cn/direct/756dcd4a0ce84dd7a57e566f3e585ff7.png
5、代码操作Hive
①、 导入依赖。
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-hive_2.12</artifactId>
    <version>3.0.0</version>
</dependency>
<dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-exec</artifactId>
    <version>2.3.3</version>
</dependency>
 
可能出现下载jar包的题目:
D:\maven\repository\org\pentaho\pentaho-aggdesigner-algorithm\5.1.5-jhyde
 
②、将hive-site.xml 文件拷贝到项目标 resources 目次中。
③、代码实现。
val sparkConf = new SparkConf().setMaster("local
[*]").setAppName("hive")
val spark:SparkSession = SparkSession.builder()
  .enableHiveSupport()
  .config(sparkConf)
  .getOrCreate()
 
spark.sql("show databases").show()
spark.sql("create database spark_sql")
spark.sql("show databases").show()
 
 
注意:
① 如果在实行操作时,出现如下错误: https://i-blog.csdnimg.cn/direct/7a7ee62277ea41ee8a03032890b5f5ea.png
可以在代码最前面增长如下代码解决:
System.setProperty("HADOOP_USER_NAME", "node01")
此处的 node01 改为本身的 hadoop 用户名称
②在开发工具中创建数据库默认是在本地仓库,通过参数修改数据库仓库的地点: config("spark.sql.warehouse.dir","hdfs://node01:9000/user/hive/warehouse")
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Spark-SQL