需求:读取json文件,并将结果写入mysql数据库。
1. 读取json文件
格式如下:
{"name":"Michael"}
{"name":"Andy", "age":30}
{"name":"Justin", “age":19}
可以看出第一行数据缺失age。
我们首先定义Person样例类:
case class Person(name:String, age:Long)
读取文件数据:
import spark.implicits._
val df: Dataset[Person] = spark.read.json("/Users/fred/Desktop/data/data_spark/people.json").as[Person]
此处文件地址即为people.json文件存放的地址,替换成自己的即可。
打印出来可以看到df.show():
+----+-------+
| age| name|
|null|Michael|
| 30| Andy|
| 19| Justin|
如果将该结果直接存入mysql数据库,会报错,因为第一行age为空。因此,我们需要将null替换为一个无意义数字,在满足mysql插入语句的同时,也便于日后进行分析。
val df1 = df.na.fill(-1, Seq("age"))
df1.show()
打印结果:
+---+-------+
|age| name|
+---+-------+
| -1|Michael|
| 30| Andy|
| 19| Justin|
+—+-------+
2. 写入mysql数据库:
val url = "jdbc:mysql://localhost:3306/testdb?characterEcoding=UTF-8"
val table = "test1"
val props = new Properties()
props.setProperty("user", "root")
props.setProperty("password", "123456")
df1.write.mode(SaveMode.Append).jdbc(url, table, props)
其中,table在数据库中可以不存在,但是数据库testdb应提前创建。
当然,在运行代码前,应当引入mysql的jar包:
mysql
mysql-connector-java
5.1.37
附完整代码如下:
import java.util.Properties
import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.types.{LongType, StructField, StructType}
import org.apache.spark.sql.{DataFrame, Dataset, SaveMode, SparkSession}
import org.apache.spark.sql.types._
object Demo1 {
Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
case class Person(name:String, age:Long)
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder()
.master("local[*]")
.appName("Spark SQL demo")
.getOrCreate()
import spark.implicits._
val df: Dataset[Person] = spark.read.json("/Users/fred/Desktop/data/data_spark/people.json").as[Person]
df.show()
df.na.fill(-1)
val df1 = df.na.fill(-1, Seq("age"))
df1.show()
val url = "jdbc:mysql://localhost:3306/testdb?characterEcoding=UTF-8"
val table = "test1"
val props = new Properties()
props.setProperty("user", "root")
props.setProperty("password", "123456")
df1.write.mode(SaveMode.Append).jdbc(url, table, props)
}
}