Spark-Datasource-API操作
1.text数据源读写操作
写操作时应用mode(“overwritew”)函数,表示如果目标文件夹已存在,那么会覆盖,详情见2
def text(spark: SparkSession): Unit ={
//隐式转换
import spark.implicits._
//读操作
val df: DataFrame = spark.read.text("file://..")
val ds: Dataset[(String,Int)] = df.map(x => {
val splits: Array[String] = x.getString(0).split(",")
(splits(0).trim,splits(1).trim.toInt)
})
//写操作
ds.write.mode("overwrite").save("out")
}
2.SaveMode使用详情
在写操作的使用调用mode()函数详情如下
1.Append
ds.write.mode("append").save("out")
表示如果目标已存在,那么会追加
2.Overwrtse
ds.write.mode("overwrite").save("out")
表示如果目标已存在,那么会覆盖
1.ErrorIfExists
ds.write.mode("error").save("out")
表示如果目标已存在,那么会报错,这是默认选项
1.Ignore
ds.write.mode("ignore").save("out")
表示如果目标已存在,那么会忽略
3.josn数据源读写操作
def json(spark: SparkSession): Unit ={
//隐式转换
import spark.implicits._
val df: DataFrame = spark.read.json("file://..")
//分别取出字段并别名,保存
df.select($"age".as("a"),$"name".as("n"),$"info.add".as("add"),$"info.home".as("home")).write.mode("overwrite").json("out")
}
4.数据源操作标准写法
1.读操作:
读取text
val text: DataFrame = spark.read.format("text").load("file://..")
读取json
val json: DataFrame = spark.read.format("json").load("file://..")
2.写操作
保存text
text.write.format("text").save("out")
保存json
text.write.format("json").save("out")
5.Parquet数据源读写操作
Parquet是一种列式存储格式
def parquet(spark: SparkSession) = {
//隐式转换
import spark.implicits._
//读操作
val df: DataFrame = spark.read.parquet("file:///home/hadoop/IdeaProjects/sparksql-train/data/users.parquet")
df.select("name","favorite_color").write.mode("overwrite").format("parquet").option("compression","none").save("out")
//写操作
spark.read.parquet("file:///home/hadoop/IdeaProjects/sparksql-train/out").show()
}
6.Datasource格式转换
def convert(spark: SparkSession): Unit ={
//隐式转换
import spark.implicits._
//读取一个json文件
val df: DataFrame = spark.read.json("file:///home/hadoop/IdeaProjects/sparksql-train/data/people2.json")
//写成一个parquet文件
df.write.mode("overwrite").format("parquet").save("out")
//测试
spark.read.parquet("file:///home/hadoop/IdeaProjects/sparksql-train/out").show()
}
7.JDBC数据源操作
我们这里以读取mysql数据源为例,
def jdbc(spark: SparkSession): Unit ={
隐式转换
import spark.implicits._
//定义一个properties
val properties = new Properties()
//设置账号
properties.put("user","root")
//设置密码
properties.put("password","root")
//三个参数,分别为:url,库名.表名,一个properties配置
val df: DataFrame = spark.read.jdbc("jdbc:mysql://localhost:3306","spark.a",properties)
df.show()
//写操作
df.write.mode(SaveMode.Append).jdbc("jdbc:mysql://192.168.0.133:3306","spark.b",properties)
}