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()方法来设置。
例如: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[Row]. 可以通过 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 roperties = new Properties()
pros.setProperty("user","root")
pros.setProperty("password","123456")
val df ataFrame = 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[Stu] = spark.sparkContext.makeRDD(List(Stu("lisi", 20),
Stu("zs", 30)))
val ds ataset[Stu] = 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
在虚拟机中下载以下配置文件:
如果想在spark-shell中毗连外部已经部署好的 Hive,需要通过以下几个步调:
① Spark 要接管 Hive 需要把 hive-site.xml 拷贝到 conf/目次下,并将url中的localhost改为node01
② 把 MySQL 的驱动 copy 到 jars/目次下
③ 把 core-site.xml 和 hdfs-site.xml 拷贝到 conf/目次下
④ 重启 spark-shell
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
可以直接运行SQL语句,如下所示:
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()
注意:
① 如果在实行操作时,出现如下错误:
可以在代码最前面增长如下代码解决:
System.setProperty("HADOOP_USER_NAME", "node01")
此处的 node01 改为本身的 hadoop 用户名称
②在开发工具中创建数据库默认是在本地仓库,通过参数修改数据库仓库的地点: config("spark.sql.warehouse.dir","hdfs://node01:9000/user/hive/warehouse")
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |