Struct Streaming 实例三 指定输出格式

数据如下

链接: 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()
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值