如何创建 SparkContext,SQLContext,StreamingContext 的几种方式?

首先,使用 ScalaIDE 或 IDEA 创建 Scala 的 Maven 工程。需要用到 spark-core,spark-sql,spark-streaming 的 jar 包,pom 文件如下:

<properties>
	<spark.version>2.1.0spark.version>
	<scala.version>2.11scala.version>
properties>

<dependencies>
	<dependency>
		<groupId>org.apache.sparkgroupId>
		<artifactId>spark-core_${scala.version}artifactId>
		<version>${spark.version}version>
	dependency>
	<dependency>
		<groupId>org.apache.sparkgroupId>
		<artifactId>spark-streaming_${scala.version}artifactId>
		<version>${spark.version}version>
	dependency>
	<dependency>
		<groupId>org.apache.sparkgroupId>
		<artifactId>spark-sql_${scala.version}artifactId>
		<version>${spark.version}version>
	dependency>
dependencies>

一、创建 SparkContext 对象

package core

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.log4j.Logger
import org.apache.log4j.Level

object Demo {
  def main(args: Array[String]): Unit = {
    // Spark使用log4j打印日志,为了避免程序执行过程中产生过多的日志,添加如下两行代码
    Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
    Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
    
    // 先创建SparkConf,再通过SparkConf创建SparkContext
    val conf = new SparkConf().setAppName("demo").setMaster("local")
    val sc = new SparkContext(conf)
    
    // 进行词频统计
    val rdd = sc.textFile("hdfs://qujianlei:9000/data/data.txt").
      flatMap(_.split(" ")).
      map(x => (x, 1)).
      reduceByKey(_+_).
      saveAsTextFile("hdfs://qujianlei:9000/output/spark/0214")
    
    sc.stop()
  }
}

data.txt 中的文件内容如下:
在这里插入图片描述
词频统计结果如下:
如何创建 SparkContext,SQLContext,StreamingContext 的几种方式?_第1张图片

二、创建 SQLContext 对象

1. 通过 new SQLContext 对象的方式

package sql

import org.apache.log4j.Level
import org.apache.log4j.Logger
import org.apache.spark.SparkConf
import org.apache.spark.sql.SQLContext
import org.apache.spark.SparkContext

case class People(id:Int, name:String, age:Int)

object Demo {
  def main(args: Array[String]): Unit = {
    // Spark使用log4j打印日志,为了避免程序执行过程中产生过多的日志,添加如下两行代码
    Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
    Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
    
    // new SQLContext的方式创建SQLContext
    val conf = new SparkConf().setAppName("demo").setMaster("local")
    val sc = new SparkContext(conf)
    val sqlc = new SQLContext(sc)
    
    // 导入SQLContext的隐式转换函数toDF
    import sqlc.implicits._
    
    val peopleRDD = sc.textFile("d:/students.txt").
      map(_.split(" ")).
      map(x => People(x(0).toInt, x(1), x(2).toInt))
    
    // 将RDD转换成DataFrame
    val peopleDF = peopleRDD.toDF
    
    // 将DataFrame注册成表
    peopleDF.createOrReplaceTempView("people")
    
    // 通过SQLContext执行查询
    sqlc.sql("select * from people").show()
    
    sc.stop()
  }
}

student.txt 文件内容:

1 Mike 24
2 MrQuJL 22
3 ZhangSan 99

查询结果:
如何创建 SparkContext,SQLContext,StreamingContext 的几种方式?_第2张图片

2. 通过 Spark2.0 引入的 SparkSession 间接访问 SQLContext,SparkContext

package sql

import org.apache.log4j.Level
import org.apache.log4j.Logger
import org.apache.spark.SparkConf
import org.apache.spark.sql.SQLContext
import org.apache.spark.SparkContext
import org.apache.spark.sql.SparkSession

case class People(id:Int, name:String, age:Int)

object Demo {
  def main(args: Array[String]): Unit = {
    // Spark使用log4j打印日志,为了避免程序执行过程中产生过多的日志,添加如下两行代码
    Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
    Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
    
    // 通过sparkSession来间接访问SQLContext
    val spark = SparkSession.builder().appName("demo").master("local").getOrCreate()
    
    // 导入SQLContext的隐式转换函数toDF
    import spark.sqlContext.implicits._
    // 下面这种导入方式也可以
    // import spark.implicits
    
    val peopleRDD = spark.sparkContext.textFile("d:/students.txt").
      map(_.split(" ")).
      map(x => People(x(0).toInt, x(1), x(2).toInt))
    
    // 将RDD转换成DataFrame
    val peopleDF = peopleRDD.toDF
    
    // 将DataFrame注册成表
    peopleDF.createOrReplaceTempView("people")
    
    // 通过SQLContext执行查询
    spark.sqlContext.sql("select * from people").show()
    // 下面这种方式也可以
    // spark.sql("select * from people").show()
    
    spark.stop()
  }
}

三、创建 StreamingContext 对象

package streaming

import org.apache.log4j.Level
import org.apache.log4j.Logger
import org.apache.spark.SparkConf
import org.apache.spark.streaming.StreamingContext
import org.apache.spark.streaming.Seconds
import org.apache.spark.storage.StorageLevel

object SocketStream {
  def main(args: Array[String]): Unit = {
    System.setProperty("hadoop.home.dir", "F:\\第七期\\hadoop-2.7.3\\hadoop-2.7.3");
    
    // 为了避免执行过程中打印过多的日志
    Logger.getLogger("org.apache.spark").setLevel(Level.OFF)
    Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
    
    // local[x]这里,x的值至少为2,表示有两个线程执行流计算,一个接受数据,一个处理数据
    // 如果将程序提交到Spark集群上运行,同理,至少保证CPU有2个核心
    val conf = new SparkConf().setAppName("demo").setMaster("local[2]")
    val ssc = new StreamingContext(conf, Seconds(3))
    
    val socketStream = ssc.socketTextStream("192.168.0.1", 1234, StorageLevel.MEMORY_AND_DISK_SER)
    
    socketStream.print()
    
    ssc.start()
    ssc.awaitTermination()
  }
}

启动程序,在 Linux 上启动 netcat:nc -l -p 1234,发送数据:
如何创建 SparkContext,SQLContext,StreamingContext 的几种方式?_第3张图片

关注我的微信公众号(曲健磊的个人随笔),观看更多精彩内容:
如何创建 SparkContext,SQLContext,StreamingContext 的几种方式?_第4张图片

你可能感兴趣的:(【Spark】)