数据源分类
spark中支持多种数据源(jdbc、parquet、csv、json等),所以在可以读取多种类型的数据源。
csv格式的数据源,他的默认分隔符是",",可以使用Excel来打开,但是会出现数据乱码(因为CSV中不同操作系统的字符编码不一致);可以使用一下方式解决:https://jingyan.baidu.com/article/4dc408484776fbc8d846f168.html parquet格式的数据源是以二进制的方式来保存数据,在保存数据时,会将数据按照字段来保存,同时还会保存各个字段的偏移量;在读取数据时,他会根据代码的内容(如果只读取部分字段),从对应的位置读取数据,这极大的加快了数据读取速度。
spark读取各种数据源
jdbc
//导入隐式转换
import spark.implicits._
/**
* load方法不会获取数据库中的数据,
* 但是他会获取数据库中表的schema信息。
*/
//"read.format"表示指定读取的数据源种类
val logs: DataFrame = spark.read.format("jdbc").options(
Map(
//数据库连接,"bigdata"表示指定的数据库名
"url" -> "jdbc:mysql://localhost:3306/bigdata",
//数据库的驱动
"driver" -> "com.mysql.jdbc.Driver",
//指定读取数据库中的数据表
"dbtable" -> "logs",
//指定读取数据库的用户
"user" -> "root",
//指定读取数据库的密码
"password" -> "123568")
).load()
csv
//指定以后读取csv类型的数据
val csv: DataFrame = spark.read.csv("D:\\data\\out1\\csv")
csv.printSchema()
val pdf: DataFrame = csv.toDF("id", "name", "age")
pdf.show()
spark.stop()
json
//指定以后读取json类型的数据(有表头)
val jsons: DataFrame = spark.read.json("D:\\data\\out1\\json")
jsons.printSchema()
jsons.show()
spark.stop()
parquet
//指定以后读取json类型的数据
val parquetLine: DataFrame = spark.read.parquet("D:\\data\\out1\\parquet")
//val parquetLine: DataFrame = spark.read.format("parquet").load("/Users/zx/Desktop/pq")
parquetLine.printSchema()
parquetLine.show()
spark.stop()
写入数据
/**
* 将结果写入到指定的数据源中
*/
val props = new Properties()
props.put("user","root")
props.put("password","root")
/**
* mode有四种方式,"Append","Overwrite",
* "ErrorIfExists", "Ignore";
* "Overwrite"表示先将已有的表及其数据全都删除,
* 再重新创建该表,最后插入新的数据;
* "Append"表示如果表已经存在,则追加在该表中
* (此时,插入的字段名必须与数据库中的表的字段名相同,否则追加失败),
* 若该表不存在,则会先创建表,再插入数据;
* "Ignore"表示如果表不存在,则创建表,并存入数据;
* 如果表存在的情况下,直接跳过数据的存储,不会报错,即不做任何操作
*"ErrorIfExists"为默认模式,表示如果数据库中已经存在该表,
* 则会直接报异常,导致数据不能存入数据库
*/
reslut.write.mode(SaveMode.ErrorIfExists).jdbc("jdbc:mysql://localhost:3306/test", "student3", props)
/**
* 将数据写入到json中
*/
reslut.write.json("D:\\data\\out1\\json")
/**
* 将数据写入到csv中
*/
reslut.write.csv("D:\\data\\out1\\csv")
/**
* 将数据写入到parquet中
*/
reslut.write.parquet("D:\\data\\out1\\parquet")
reslut.show()
spark.close()