数据如下
链接: https://pan.baidu.com/s/1KrG0q0rhFM450H1in3og3g
提取码: 8ysc
题目如下
1、使用Structured Streaming读取Socket数据,把单词和单词的反转组成 json 格式写入到当前目录中的file文件夹中
2、请使用Structured Streaming读取Student_info文件夹写的csv文件,
2.1、统计出文件中的男女生各有多少人
2.2、统计出姓“王”男生和女生的各有多少人
3、请使用Structured Streaming读取department_info文件夹写的csv文件
3.1统计出各个院系的分别多少条信息
第1题
方式一
缺点: 只能输出到文件夹,不能指定文件
package com.czxy.exercise02.exercise01
import java.io.FileOutputStream
import org.apache.spark.sql.{DataFrame, ForeachWriter, SparkSession}
/**
* @author 红尘丶世界
* @version v 1.0
* @date 2020.4.17
*/
object Test01_01 {
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder
.master("local[*]")
.appName("StructuredNetworkWordCount")
.getOrCreate()
spark.sparkContext.setLogLevel("WARN")
val lines: DataFrame = spark.readStream
.format("socket")
.option("host", "hadoop01")
.option("port", "9999")
.load()
import spark.implicits._
val rs = lines.as[String].flatMap(x => x.split(" "))
.map(x => (x,x.reverse)).toDF("原单词","反转单词")
rs.writeStream
.format("json") //指定输出格式
.outputMode("append")
.option("path","./file") //指定输出到哪个文件夹
.option("checkpointLocation","./checkpoint")
.start()
.awaitTermination()
}
}
方式二
特点: 更灵活,可以自定义输出的文件名
import java.io.FileOutputStream
import org.apache.spark.sql.{DataFrame, ForeachWriter, SparkSession}
/**
* @author 红尘丶世界
* @version v 1.0
* @date 2020.4.17
*/
object Test01 {
def main(args: Array[String]): Unit = {
//创建sparkSession
val spark = SparkSession
.builder
.master("local[*]")
.appName("StructuredNetworkWordCount")
.getOrCreate()
//设置日志级别
spark.sparkContext.setLogLevel("WARN")
//读取数据
val lines: DataFrame = spark.readStream
.format("socket")
.option("host", "hadoop01")
.option("port", "9999")
.load()
//导入隐式转换
import spark.implicits._
//处理数据,并拼接为 json格式
val rs = lines.as[String].flatMap(x => x.split(" ")).map(x => ("\"{\"" + x + "\":\"" + x.reverse + "\"}\""))
//输出
rs.writeStream
.foreach(new ForeachWriter[String] {
//定义一个流用来输出到文件
var fos: FileOutputStream = _
override def open(partitionId: Long, version: Long): Boolean = {
try {
//初始化流 指定路径 和是否追加到文件中
fos = new FileOutputStream("./file/Test01.json", true);
true
}
catch {
case e: Exception => false
}
}
override def process(record: String): Unit = {
//输出一行数据
fos.write(record.getBytes)
//换行输出
fos.write("\t\n".getBytes)
}
override def close(errorOrNull: Throwable): Unit = {
//关流
if (fos != null) {
fos.close()
}
}
})
.outputMode("append") //输出新生成的(没有进行聚合过用append)
.format("foreach") //指定方式为foreach 自定义输出
.start() //执行
.awaitTermination() //等待响应
}
}
第2.1题
package com.czxy.exercise02.exercise01
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.{DataFrame, SparkSession}
/**
* @author 红尘丶世界
* @version v 1.0
* @date 2020.4.17
*/
object Test02_1 {
def main(args: Array[String]): Unit = {
//创建sparkSession
val spark: SparkSession = SparkSession.builder().master("local[*]")
.appName("StructStreamingJson")
.getOrCreate()
//设置日志级别
spark.sparkContext.setLogLevel("ERROR")
//读取文件
//创建元数据信息
val structType: StructType = new StructType()
.add("studentId", "string")
.add("name", "string")
.add("sex", "string")
.add("clazzId", "integer")
.add("time", "string")
//读取数据
val df: DataFrame = spark.readStream.schema(structType)
.option("header",true) //数据中第一行是字段名(要去除)
.csv("D:\\dev\\大数据\\大数据资料\\spark\\student_info")
//根据sex进行分组并统计
val frame1: DataFrame = df.groupBy("sex").count()
//输出数据到控制台
frame1.writeStream
.outputMode("complete")
.format("console")
.start()
.awaitTermination()
}
}
第2.2题
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.{DataFrame, SparkSession}
/**
* @author 红尘丶世界
* @version v 1.0
* @date 2020.4.17
*/
object Test02_2 {
def main(args: Array[String]): Unit = {
//创建sparkSession
val spark: SparkSession = SparkSession.builder().master("local[*]")
.appName("StructStreamingJson")
.getOrCreate()
//设置日志级别
spark.sparkContext.setLogLevel("ERROR")
//读取文件
//创建元数据信息
val structType: StructType = new StructType()
.add("studentId", "string")
.add("name", "string")
.add("sex", "string")
.add("clazzId", "integer")
.add("time", "string")
//读取数据
val df: DataFrame = spark.readStream.schema(structType)
.option("header",true) //数据中第一行是字段名(要去除)
.csv("D:\\dev\\大数据\\大数据资料\\spark\\student_info")
//条件查询 like '%王%',并按照性别进行分组,并求和
val frame: DataFrame = df.where("name LIKE '王%'").groupBy("sex").count()
//输出到控制台
frame.writeStream
.outputMode("complete")
.format("console")
.start()
.awaitTermination()
}
}
第3题
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.{DataFrame, SparkSession}
/**
* @author 红尘丶世界
* @version v 1.0
* @date 2020.4.17
*/
object Test03 {
def main(args: Array[String]): Unit = {
//创建sparkSession
val spark: SparkSession = SparkSession.builder().master("local[*]")
.appName("StructStreamingJson")
.getOrCreate()
//设置日志级别
spark.sparkContext.setLogLevel("ERROR")
//读取文件
//创建元数据信息
val structType: StructType = new StructType()
.add("departmentId", "integer")
.add("departmentName", "string")
//读取数据
val df: DataFrame = spark.readStream.schema(structType)
.option("header",true) //数据中第一行是字段名(要去除)
.csv("D:\\dev\\大数据\\大数据资料\\spark\\department_info")
//根据departmentId 进行分区,并记数
val frame: DataFrame = df.groupBy("departmentId").count()
//输出到控制台
frame.writeStream
.outputMode("complete")
.format("console")
.start()
.awaitTermination()
}
}