import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.{DataFrame, SparkSession}
object WordCountDemo1 {
def main(args: Array[String]): Unit = {
Logger.getLogger("org").setLevel(Level.WARN)
val spark = SparkSession.builder()
.appName("WordCountDemo1")
.master("local").getOrCreate()
import spark.implicits._
/**
* Socket方式是最简单的数据输入源,本程序就是使用的这种方式,
* 用户只需要指定"socket"形式并配置监听的IP和Port即可。
* Socket方式Streaming是接收UTF8的text数据,并且这种方式最后只用于测试,不要用户端到端的项目中。
*/
val lines: DataFrame = spark.readStream
.format("socket")
.option("host", "master")
.option("port", "9999")
.load()
/**
* 首先将接受到的数据流lines转换为String类型的序列;
* 接着每一批数据都以空格分隔为独立的单词;
* 最后再对每个单词进行分组并统计次数。
*/
val words = lines.as[String].flatMap(_.split(" "))
val wordCounts: DataFrame = words.groupBy("value").count()
/**
* 通过DataFrame对象的writeStream方法获取DataStreamWrite对象,DataStreamWrite类定义了一些数据输出的方式。
* 本程序将数据输出到控制终端。
* 注意:只有在调用start()方法后,才开始执行Streaming进程。
* start()方法会返回一个StreamingQuery对象,用户可以使用该对象来管理Streaming进程。
* 本程序中调用awaitTermination()方法阻塞接收所有数据。
*/
val query = wordCounts.writeStream.outputMode("complete")
.format("console").start()
//注意:使用append这个输出模式时,不能用wordCounts
// val query = words.writeStream.outputMode("append")
// .format("console").start()
query.awaitTermination()
}
}