1、Data Sources
Spark SQL支持通过DataFrame接口对各种数据源进行操作。DataFrame可以使用关系转换进行操作,也可以用于创建临时视图。将DataFrame注册为临时视图允许您对其数据运行SQL查询。本节描述使用Spark数据源加载和保存数据的一般方法,然后介绍可用于内置数据源的特定选项。
数据源是在Spark1.2版本出现的,Spark SQL开放了一系列接入外部数据源的接口,来让开发者可以实现。例如读取mysql,hive,hdfs,hbase等,而且支持很多种格式如json, parquet, avro, csv格式。我们可以开发出任意的外部数据源来连接到Spark SQL,然后我们就可以通过外部数据源API了进行操作。
2、读取Json文件
前面我们读取Json文件的时候是这么写的:
scala> val df=spark.read.json("file:///home/hadoop/data/stu1.json")
df: org.apache.spark.sql.DataFrame = [email: string, id: string ... 2 more fields]
scala> df.show
+--------+---+--------+-----------+
| email| id| name| phone|
+--------+---+--------+-----------+
|1@qq.com| 1|zhangsan|13721442689|
|2@qq.com| 2| lisi|13721442687|
|3@qq.com| 3| wangwu|13721442688|
|4@qq.com| 4|xiaoming|13721442686|
|5@qq.com| 5|xiaowang|13721442685|
+--------+---+--------+-----------+
标准写法是这样的:
通过format指定要读取的文件格式,用load加载。
scala> val df=spark.read.format("json").load("file:///home/hadoop/data/stu1.json")
df: org.apache.spark.sql.DataFrame = [email: string, id: string ... 2 more fields]
scala> df.show
+--------+---+--------+-----------+
| email| id| name| phone|
+--------+---+--------+-----------+
|1@qq.com| 1|zhangsan|13721442689|
|2@qq.com| 2| lisi|13721442687|
|3@qq.com| 3| wangwu|13721442688|
|4@qq.com| 4|xiaoming|13721442686|
|5@qq.com| 5|xiaowang|13721442685|
+--------+---+--------+-----------+
scala> df.printSchema
root
|-- email: string (nullable = true)
|-- id: string (nullable = true)
|-- name: string (nullable = true)
|-- phone: string (nullable = true)
scala> df.createOrReplaceTempView("student")
scala> spark.sql("select * from student").show
19/08/07 06:47:25 WARN ObjectStore: Failed to get database global_temp, returning NoSuchObjectException
+--------+---+--------+-----------+
| email| id| name| phone|
+--------+---+--------+-----------+
|1@qq.com| 1|zhangsan|13721442689|
|2@qq.com| 2| lisi|13721442687|
|3@qq.com| 3| wangwu|13721442688|
|4@qq.com| 4|xiaoming|13721442686|
|5@qq.com| 5|xiaowang|13721442685|
+--------+---+--------+-----------+
3、读取Parquet数据
//把Json文件数据转成parquet格式,然后保存到该路径下
//默认是snappy压缩
scala> df.write.format("parquet").save("file:///home/hadoop/data/parquet_data")
[hadoop@vm01 data]$ cd parquet_data/
[hadoop@vm01 parquet_data]$ ll
total 4
-rw-r--r--. 1 hadoop hadoop 1105 Aug 7 07:13 part-00000-add54ffe-b938-4793-8919-6f74543648a0-c000.snappy.parquet
-rw-r--r--. 1 hadoop hadoop 0 Aug 7 07:13 _SUCCESS
读取
scala> spark.read.format("parquet").load("file:///home/hadoop/data/parquet_data").show
+--------+---+--------+-----------+
| email| id| name| phone|
+--------+---+--------+-----------+
|1@qq.com| 1|zhangsan|13721442689|
|2@qq.com| 2| lisi|13721442687|
|3@qq.com| 3| wangwu|13721442688|
|4@qq.com| 4|xiaoming|13721442686|
|5@qq.com| 5|xiaowang|13721442685|
+--------+---+--------+-----------+
4、读取Hive中的数据
读取hive的数据,先要hive和spark整合后才能读。
如何整合,看博客:https://blog.csdn.net/greenplum_xiaofan/article/details/98578504
这里说明一下,在IDEA中需要添加.enableHiveSupport()
支持hive
val spark=SparkSession.builder()
.master("local")
.appName("DataSoureceApp")
.enableHiveSupport() //支持hive
.getOrCreate()
scala> spark.sql("show tables").show(false)
19/08/07 07:20:14 WARN ObjectStore: Failed to get database global_temp, returning NoSuchObjectException
+--------+---------+-----------+
|database|tableName|isTemporary|
+--------+---------+-----------+
|default |worker |false |
+--------+---------+-----------+
5、读取MySQL中的数据
官网:http://spark.apache.org/docs/2.4.2/sql-data-sources-jdbc.html
IDEA上开发,要添加mysql-connector-java-5.1.47.jar
包
找到你的MySQL-Jar包,看到下图就表名添加成功
然后重启下IDEA
package com.ruozedata.spark
import org.apache.spark.sql.SparkSession
object DataSoureceApp {
def main(args: Array[String]): Unit = {
val spark=SparkSession.builder()
.master("local[2]")
.appName("DataSoureceApp")
.getOrCreate()
// Loading data from a JDBC source
val jdbcDF = spark.read.format("jdbc")
.option("url", "jdbc:mysql://192.168.137.130:3306?useSSL=true")
// .option("driver","com.mysql.jdbc.Driver") //这个在spark-shell中是需要添加这个选项的
.option("dbtable", "ruoze_d6.tbls")
.option("user", "root")
.option("password", "syncdb123!")
.load()
jdbcDF.show(false)
spark.stop()
}
}