SparkSQL外部数据源/Data Sources

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()

  }
}

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章