适配的文件类型
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
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()方法来设置
Spark SQL 可以配置 CSV 文件的列表信息,读取 CSV 文件,CSV 文件的第一行设置为数据列
spark.read.format("csv")
.option("sep", ";")//分隔符
.option("inferSchema","true")
.option("header", "true")//表头
.load("data/user.csv")//路径
mysql和hive的部署见博客:hive部署过程记录_是阿威啊的博客-CSDN博客
mysql
mysql-connector-java
5.1.27
方式 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)
方式 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)
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()
}
测试使用内嵌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
代码操作 Hive
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
如果 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()
工具类:获取环境
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()
}