SparkSQL-数据的加载和保存(包含数据库)

一、文件读写

1、read

适配的文件类型

spark.read.
csv format jdbc json load option options orc parquet schema table text textFile

读文件时直接在文件上进行查询: 文件格式.`文件路径`

spark.sql("select * from json.`/opt/module/data/user.json`").show

2、write写

df.write.mode("append").json("/opt/module/data/output")
df.write.format("com.databricks.spark.csv")
.option("header", "true") save("myFile.csv")
上述方法,用了save的方法,csv方法就是save方法的一种封装,对比如下,
然后会产生一个myFile.csv的文件夹,该文件夹的命名也可以不用.csv结尾,
同时其中的数据会保存成多个csv文件。

使用 mode()方法来设置

SparkSQL-数据的加载和保存(包含数据库)_第1张图片

Spark SQL 可以配置 CSV 文件的列表信息,读取 CSV 文件,CSV 文件的第一行设置为数据列

spark.read.format("csv")
    .option("sep", ";")//分隔符
    .option("inferSchema","true")
    .option("header", "true")//表头
    .load("data/user.csv")//路径

二、sparkSQL连接Mysql

mysql和hive的部署见博客:hive部署过程记录_是阿威啊的博客-CSDN博客

1、增加依赖关系 


 mysql
 mysql-connector-java
 5.1.27

2、连库读数据

方式 1:通用的 load 方法读取

spark.read.format("jdbc")
 .option("url", "jdbc:mysql://linux1:3306/spark-sql")
 .option("driver", "com.mysql.jdbc.Driver")
 .option("user", "root")
 .option("password", "123123")
 .option("dbtable", "user")
 .load().show

方式 2:通用的 load 方法读取 参数另一种形式

spark.read.format("jdbc")
 .options(Map("url"->"jdbc:mysql://linux1:3306/spark-sql?user=root&password=
123123",
 "dbtable"->"user","driver"->"com.mysql.jdbc.Driver")).load().show

方式 3:使用 jdbc 方法读取(推荐)

val props: Properties = new Properties()
props.setProperty("user", "root")
props.setProperty("password", "123123")
val df: DataFrame = spark.read.jdbc("jdbc:mysql://linux1:3306/spark-sql", 
"user", props)

3、连库写数据

方式 1:通用的方式 format 指定写出类型

ds.write
 .format("jdbc")
 .option("url", "jdbc:mysql://linux1:3306/spark-sql")
 .option("user", "root")
 .option("password", "123123")
 .option("dbtable", "user")
 .mode(SaveMode.Append)
 .save()

方式 2:通过 jdbc 方法 

val props: Properties = new Properties()
props.setProperty("user", "root")
props.setProperty("password", "123123")
ds.write.mode(SaveMode.Append).jdbc("jdbc:mysql://linux1:3306/spark-sql", 
"user", props)

4、连库操作练习

package SparkSQL.DataloadAndSave

import Util.Env
import bean.CityList
import org.apache.log4j.{Level, Logger}
import org.apache.spark.SparkContext
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}

import java.util.Properties

object JsonDataDemo extends App with Env{
  Logger.getLogger("org").setLevel(Level.ERROR)

  //准备spark环境
  private val sc: SparkContext = getSparkContext()
  //准备SparkSession环境,SparkSession 是 Spark 最新的 SQL 查询起始点
  private val spark: SparkSession = getSparkSession()
  import spark.implicits._

  //读取Json文件
  private val frame: DataFrame = spark.read.json("src/data/AAAS_RULE_20220316.000")
  frame.createOrReplaceTempView("rule")
  spark.sql("select * from rule limit 3").show()
  //保存文件
  private val frame1: DataFrame = spark.read.csv("src/data/PROV_MAAPTO200.csv")
  frame1.coalesce(1).write.mode(SaveMode.Overwrite).option("header", "true").csv("myFile.csv")
  
  //读取mysql数据库
  val props: Properties = new Properties()
  props.setProperty("user", "root")
  props.setProperty("password", "123456")
  val df: DataFrame = spark.read.jdbc("jdbc:mysql://hadoop01:3306/mysql","firsttable", props)
  df.show
  //写数据到mysql数据库
  private val value: RDD[CityList] = sc.makeRDD(List(CityList(1,"no","yes")))
  value.toDS().write.mode(SaveMode.Append).jdbc("jdbc:mysql://hadoop01:3306/mysql","firsttable", props)
  spark.read.jdbc("jdbc:mysql://hadoop01:3306/mysql","firsttable", props).show
  /*
  val props: Properties = new Properties()
  props.setProperty("user", "settle")
  props.setProperty("password", "Settle!123")
  val cspInfo: DataFrame = spark.read.jdbc("jdbc:oracle:thin:@10.243.208.23:1521:COMMDB1", "csp_info", props)
  cspInfo.show()
   */
  spark.stop()
  sc.stop()
}

三、sparkSQL连接hive

测试使用内嵌hive,不推荐。本文测试使用外部的hive集群

 连接hive的方式有多种:

如:Spark SQL CLI,在Spark 目录下执行如下命令启动 Spark SQL CLI,直接执行 SQL 语句,类似一 Hive 窗口

bin/spark-sql

重点推荐:Spark beeline 

Spark Thrift Server 是 Spark 社区基于 HiveServer2 实现的一个 Thrift 服务。

旨在无缝兼容HiveServer2。

 如果想连接 Thrift Server,需要通过以下几个步骤:

➢ Spark 要接管 Hive 需要把 hive-site.xml 拷贝到 conf/目录下

➢ 把 Mysql 的驱动 copy 到 jars/目录下

➢ 如果访问不到 hdfs,则需要把 core-site.xml 和 hdfs-site.xml 拷贝到 conf/目录下

➢ 启动 Thrift Server

使用 beeline 连接 Thrift Server
bin/beeline -u jdbc:hive2://hadoop01:10000 -n root

SparkSQL-数据的加载和保存(包含数据库)_第2张图片

 代码操作 Hive

1、加入依赖


 org.apache.spark
 spark-hive_2.12
 3.0.0


 org.apache.hive
 hive-exec
 1.2.1


 mysql
 mysql-connector-java
 5.1.27

2、将 hive-site.xml 文件拷贝到项目的 resources 目录中

如果 hive-site.xml 中设置了hive.metastore.uris,代码中就不用加上.config("spark.sql.warehouse.dir", "hdfs://hadoop01:10000/user/hive/warehouse")

 增加依赖


    hive.metastore.uris
    thrift://hadoop01:9083
//创建 SparkSession
val spark: SparkSession = SparkSession
 .builder()
 .enableHiveSupport()
 .master("local[*]")
 .appName("sql")
 .getOrCreate()
//注意:在开发工具中创建数据库默认是在本地仓库,通过参数修改数据库仓库的地址: 
config("spark.sql.warehouse.dir", "hdfs://hadoop01:8020/user/hive/warehouse")
val spark = SparkSession.builder()
.enableHiveSupport()
.config("spark.sql.warehouse.dir", "hdfs://hadoop01:8020/user/hive/warehouse")
.getOrCreate()

3、连库操作练习

工具类:获取环境

package Util

import org.apache.spark.sql.SparkSession
import org.apache.spark.{SparkConf, SparkContext}

trait Env {

  def getSparkContext(appName: String="AppName",master:String="local[*]"):SparkContext = {
    val conf: SparkConf = new SparkConf()
      .set("spark.sql.warehouse.dir", "hdfs://hadoop01:9083/user/hive/warehouse")
      .set("spark.sql.catalogImplementation", "hive")
      .setMaster(master)
      .setAppName(appName)
    new SparkContext(conf)
  }
  def getSparkSession(appName: String="AppName",master:String="local[*]"): SparkSession = {
    SparkSession.builder().enableHiveSupport().master("local").appName("dataSetDemo").getOrCreate()
  }
  
  def getHiveSparkSession(appName: String="AppName",master:String="local[*]"): SparkSession = {
    SparkSession.builder()
      .enableHiveSupport()
     // .config("spark.sql.warehouse.dir", "hdfs://hadoop01:10000/user/hive/warehouse")
      .master(master)
      .appName(appName)
      .getOrCreate()
  }


}

主类:执行连库操作

package SparkSQL.DataloadAndSave

import SparkSQL.UDF.UdfDemo.{getSparkContext, getSparkSession}
import org.apache.log4j.{Level, Logger}
import org.apache.spark.SparkContext
import org.apache.spark.sql.SparkSession

object hiveConnect extends App {
 Logger.getLogger("org").setLevel(Level.ERROR)
 
 //准备spark环境
 private val sc: SparkContext = getSparkContext()
 System.setProperty("HADOOP_USER_NAME","root")
 private val spark: SparkSession = getSparkSession()
 spark.sql(
  """
   |CREATE TABLE if not exists `product_info`(
   |  `product_id` bigint,
   |  `product_name` string,
   |  `extend_info` string)
   |row format delimited fields terminated by '\t'
     """.stripMargin)
 spark.sql("show create table product_info").show(false)
 spark.sql("select * from product_info").show
 spark.stop()
 sc.stop()
}

你可能感兴趣的:(spark基础知识学习和练习,spark,hive,mysql,数据仓库)