json解析 spark_spark读取json文件,并将结果写入mysql数据库

这篇博客介绍了如何使用Spark读取JSON文件,处理缺失值,然后将处理后的数据写入MySQL数据库。首先,定义了Person类来匹配JSON结构,接着使用`spark.read.json()`加载数据,处理`age`字段的缺失值,最后将数据写入到指定的数据库表中。
摘要由CSDN通过智能技术生成

需求:读取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)

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值