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

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

<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<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()
}
}

二、创建 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()
}
}

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,发送数据:

spark学习常用的操作的更多相关文章

  1. 【spark】常用转换操作:reduceByKey和groupByKey

    1.reduceByKey(func) 功能: 使用 func 函数合并具有相同键的值. 示例: val list = List("hadoop","spark" ...

  2. 【spark】常用转换操作:join

    join就表示内连接. 对于内链接,对于给定的两个输入数据集(k,v1)和(k,v2) 根据相同的k进行连接,最终得到(k,(v1,v2))的数据集. 示例 val arr1 = Array((&qu ...

  3. 【spark】常用转换操作:keys 、values和mapValues

    1.keys 功能: 返回所有键值对的key 示例 val list = List("hadoop","spark","hive",&quo ...

  4. 【spark】常用转换操作:sortByKey()和sortBy()

    1.sortByKey() 功能: 返回一个根据键排序的RDD 示例 val list = List(("a",3),("b",2),("c" ...

  5. Spark学习之键值对操作总结

    键值对 RDD 是 Spark 中许多操作所需要的常见数据类型.键值对 RDD 通常用来进行聚合计算.我们一般要先通过一些初始 ETL(抽取.转化.装载)操作来将数据转化为键值对形式.键值对 RDD ...

  6. Spark学习之键值对(pair RDD)操作(3)

    Spark学习之键值对(pair RDD)操作(3) 1. 我们通常从一个RDD中提取某些字段(如代表事件时间.用户ID或者其他标识符的字段),并使用这些字段为pair RDD操作中的键. 2. 创建 ...

  7. jackson学习之三:常用API操作

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. 在spark中操作mysql数据 ---- spark学习之七

    使用spark的 DataFrame 来操作mysql数据. DataFrame是比RDD更高一个级别的抽象,可以应用SQL语句进行操作,详细参考: https://spark.apache.org/ ...

  9. Spark学习笔记之RDD中的Transformation和Action函数

    总算可以开始写第一篇技术博客了,就从学习Spark开始吧.之前阅读了很多关于Spark的文章,对Spark的工作机制及编程模型有了一定了解,下面把Spark中对RDD的常用操作函数做一下总结,以pys ...

随机推荐

  1. shell脚本,awk 匹配的做修改后打印,不匹配的打印。

    文件file内容如下a 1a 2b 3b 4 b 5c 6c 7 要求:第一列匹配b时,如果第二列大于3,那么将第二列加上1后打印,其余的原封不动打印.结果如下: a 1a 2b 3b 5 b 6c ...

  2. 第九次第十次作业 网页设计HTML语言之mp3 与mp4音频与视频两次作业,功能在一起也可

    参考的网址是: MP3 参考http://www.cnblogs.com/qingyundian/p/7831098.html MP4参考 http://www.cnblogs.com/qingyun ...

  3. 解析Java finally

    以下用几个简单的例子介绍一下finally的用法: 例子1 public class Test { public static void main(String[] args) { System.ou ...

  4. axure笔记--内部框架交互链接

    内部框架的作用: 1.可以引用站点地图的页面 2.可以引用视频(链接视频)(axure中没有媒体控件) 3.可以引用本地文件 4.引用网页(注意:1.超链接地址要加上http://   2.内部框架大 ...

  5. Matplotlib基本图形之折线图

    Matplotlib基本图形之折线图折线图特点 折线图是用折线将各数据连起来组成的图形常用来观察数据随时间变化的趋势例如:股票价格,温度变化,等等 示例代码: import os import tim ...

  6. windows下的host工作原理

    在Window系统中有个Hosts文件(没有后缀名),在Windows98系统下该文件在Windows目录,在Windows2000/XP系统中位于C:\Winnt\System32\Drivers\ ...

  7. PHP优化之批量操作MySQL

    设计一个数据表如下: create table optimization( id INT NOT NULL AUTO_INCREMENT, value VARCHAR(10) NOT NULL, PR ...

  8. ASP.NET(二):Application、Session和Server对象

    导读:在上篇博客中,总结了:Reques对象和Response对象的区别,以及IsPostBack属性的用法.其中说明Asp.net有6大对象,那么,这次就介绍剩下的3个对象,分别是:Applicat ...

  9. CSU-1336: Interesting Calculator,最短路思想!

    1336: Interesting Calculator 这道题被LZQ抢了一血,于是去读题发现题意不难,纯广搜结果写的一塌糊涂. 题意:给你两个数x,y.由x每次可以经过一系列操作变换,每个变换都有 ...

  10. BZOJ3996 [TJOI2015]线性代数 【最小割】

    题目 给出一个NN的矩阵B和一个1N的矩阵C.求出一个1*N的01矩阵A.使得 D=(AB-C)A^T最大.其中A^T为A的转置.输出D 输入格式 第一行输入一个整数N,接下来N行输入B矩阵,第i行第 ...