首先创建程序入口和jdbc连接:
得到的是DataFrame类型数据:
val spark = SparkSession.builder().appName("JdbcDataSource")
.master("local[*]")
.getOrCreate()
import spark.implicits._
//load这个方法不会读取真正mysql的数据
//属于转换操作
val logs: DataFrame = spark.read.format("jdbc").options(
Map("url" -> "jdbc:mysql://localhost:3306/bigdata",
"driver" -> "com.mysql.jdbc.Driver",
"dbtable" -> "logs",
"user" -> "root",
"password" -> "123568")
).load()
对Mysql的数据进行处理:
//1.打印出表信息
logs.printSchema()
logs.show()
//2.对表进行过滤等操作
val filtered: Dataset[Row] = logs.filter(r => {
r.getAs[Int]("age") <= 13
})
filtered.show()
//也可使用lambda表达式
val r = logs.filter($"age" <= 13)
//调用Dataset的API
val r = logs.where($"age" <= 13)
val reslut: DataFrame = r.select($"id", $"name", $"age" * 10 as "age")
将处理的数据写入其他数据格式中:
1.写入Mysql
//1.写入Mysql
val props = new Properties()
props.put("user","root")
props.put("password","123568")
reslut.write.mode("ignore").jdbc("jdbc:mysql://localhost:3306/bigdata", "logs1", props)
注意此处的mode:
//mode方法源码
def mode(saveMode: String): DataFrameWriter[T] = {
this.mode = saveMode.toLowerCase(Locale.ROOT) match {
case "overwrite" => SaveMode.Overwrite
case "append" => SaveMode.Append
case "ignore" => SaveMode.Ignore
case "error" | "errorifexists" | "default" => SaveMode.ErrorIfExists
case _ => throw new IllegalArgumentException(s"Unknown save mode: $saveMode. " +
"Accepted save modes are 'overwrite', 'append', 'ignore', 'error', 'errorifexists'.")
}
this
}
//mode的Ignore属性注释
/**
* Ignore mode means that when saving a DataFrame to a data source, if data already exists,
* the save operation is expected to not save the contents of the DataFrame and to not
* change the existing data.
*
* @since 1.3.0
*/
2.将DataFrame保存为text:
注意:将DataFrame保存为text格式,只能保存一列,且数据类型只能为String
// DataFrame保存成text
reslut.write.text("/Users/text")
3.保存为json和csv格式
reslut.write.json("/Users/zx/Desktop/json")
reslut.write.csv("/Users/zx/Desktop/csv")
4.将数据保存为parquet格式
reslut.write.parquet("hdfs://node-4:9000/parquet")
csv文件格式是以逗号分隔,通过Sparksession读取数据转换为DataFrame数据结构
val spark = SparkSession.builder().appName("CsvDataSource")
.master("local[*]")
.getOrCreate()
//指定以后读取json类型的数据
val csv: DataFrame = spark.read.csv("/Users/csv")
csv.printSchema()
val pdf: DataFrame = csv.toDF("id", "name", "age")
.....
pdf.show()
spark.stop()
也是通过SparkSql的api读取数据,将json数据格式转换为DataFrame格式,其中Json的Key为表头。
val spark = SparkSession.builder().appName("JdbcDataSource")
.master("local[*]")
.getOrCreate()
import spark.implicits._
//指定以后读取json类型的数据(有表头)
val jsons: DataFrame = spark.read.json("/Users/json")
val filtered: DataFrame = jsons.where($"age" <=500)
filtered.printSchema()
filtered.show()
spark.stop()
parquet文件是列式存储格式的,不仅保存了数据,还保存了元数据信息(包含列的名字/类型/是否可以为空等)
val spark = SparkSession.builder().appName("ParquetDataSource")
.master("local[*]")
.getOrCreate()
//指定以后读取json类型的数据
val parquetLine: DataFrame = spark.read.parquet("/Users/zx/Desktop/parquet")
parquetLine.printSchema()
parquetLine.show()
spark.stop()
注意点:
1.如果想让hive运行在spark上,一定要开启spark对hive的支持
.enableHiveSupport()
2.想要使用hive的元数据库,必须指定hive元数据的位置,添加一个hive-site.xml到当前程序的classpath(Resources)下即可
3.要在/etc/profile中配置一个环节变量(让sparkSQL知道hdfs在哪里,其实就是namenode在哪里)
exprot HADOOP_CONF_DIR(如果在IDEA中编写程序,需要将Hadoop配置文件中的core-site和hdfs-site文件加入resources目录下,让sparksql知道那个是Data/NameNode)
4.将Hive配置文件中的hive-site.xml加入到Spark的conf中
5.需要上传一个jdbc连接包到Spark的lib中
//如果想让hive运行在spark上,一定要开启spark对hive的支持
val spark = SparkSession.builder()
.appName("HiveOnSpark")
.master("local[*]")
.enableHiveSupport()//启用spark对hive的支持(可以兼容hive的语法了)
.getOrCreate()
//想要使用hive的元数据库,必须指定hive元数据的位置,添加一个hive-site.xml到当前程序的classpath下即可
//val result: DataFrame = spark.sql("SELECT * FROM t_boy ORDER BY fv DESC")
val sql: DataFrame = spark.sql("CREATE TABLE niu (id bigint, name string)")
sql.show()
//result.show()
spark.close()