Spark文档阅读之二:Programming Guides - Quick Start
Quick Start: https://spark.apache.org/docs/latest/quick-start.html
一、最简单的Spark Shell交互分析
scala> val textFile = spark.read.textFile("README.md") # 构建一个Dataset
textFile: org.apache.spark.sql.Dataset[String] = [value: string]
scala> textFile.count() # Dataset的简单计算
res0: Long =
scala> val linesWithSpark = textFile.filter(line => line.contain("Spark")) # 由现有Dataset生成新Dataset
res1: org.apache.spark.sql.Dataset[String] = [value: string]
# 等价于:
# res1 = new Dataset()
# for line in textFile:
# if line.contain("Spark"):
# res1.append(line)
# linesWithSpark = res1
scala> linesWithSpark.count()
res2: Long =
# 可以将多个操作串行起来
scala> textFile.filter(line => line.contain("Spark")).count()
res3: Long =
进一步的Dataset分析:
scala> textFile.map(line => line.split(" ").size).reduce((a,b) => if (a > b) a else b)
res12: Int =
# 其实map和reduce就是两个普通的算子,不要被MapReduce中一个map配一个reduce、先map后reduce的思想所束缚
# map算子就是对Dataset的元素X计算fun(X),并且将所有f(X)作为新的Dataset返回
# reduce算子其实就是通过两两计算fun(X,Y)=Z,将Dataset中的所有元素归约为1个值
# 也可以引入库进行计算
scala> import java.lang.Math
import java.lang.Math
scala> textFile.map(line => line.split(" ").size).reduce((a, b) => Math.max(a, b))
res14: Int =
# 还可以使用其他算子
scala> val wordCounts = textFile.flatMap(line => line.split(" ")).groupByKey(identity).count()
# flatMap算子也是对Dataset的每个元素X执行fun(X)=Y,只不过map的res是
# res.append(Y),如[[Y11, Y12], [Y21, Y22]],结果按元素区分
# 而flatMap是
# res += Y,如[Y11, Y12, Y21, Y22],各元素结果合在一起
# groupByKey算子将Dataset的元素X作为参数传入进行计算f(X),并以f(X)作为key进行分组,返回值为KeyValueGroupedDataset类型
# 形式类似于(key: k; value: X1, X2, ...),不过KeyValueGroupedDataset不是一个Dataset,value列表也不是一个array
# 注意:这里的textFile和textFile.flatMap都是Dataset,不是RDD,groupByKey()中可以传func;如果以sc.textFile()方法读文件,得到的是RDD,groupByKey()中间不能传func
# identity就是函数 x => x,即返回自身的函数
# KeyValueGroupedDataset的count()方法返回(key, len(value))列表,结果是Dataset类型
scala> wordCounts.collect()
res37: Array[(String, Long)] = Array((online,), (graphs,), ...
# collect操作:将分布式存储在集群上的RDD/Dataset中的所有数据都获取到driver端
数据的cache:
scala> linesWithSpark.cache() # in-memory cache,让数据在分布式内存中缓存
res38: linesWithSpark.type = [value: string] scala> linesWithSpark.count()
res41: Long =
二、最简单的独立Spark任务(spark-submit提交)
import org.apache.spark.sql.SparkSession
object SimpleApp {
def main(args: Array[String]) {
val logFile = "/Users/dxm/work-space/spark-2.4.5-bin-hadoop2.7/README.md"
val spark = SparkSession.builder.appName("Simple Application").getOrCreate()
val logData = spark.read.textFile(logFile).cache()
val numAs = logData.filter(line => line.contains("a")).count() # 包含字母a的行数
val numBs = logData.filter(line => line.contains("b")).count() # 包含字母b的行数
println(s"Lines with a: $numAs, Lines with b: $numBs")
spark.stop()
}
}
2)编写sbt依赖文件build.sbt
name := "Simple Application" version := "1.0" scalaVersion := "2.12.10" libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.4.5"
其中,"org.apache.spark" %% "spark-sql" % "2.4.5"这类库名可以在网上查到,例如https://mvnrepository.com/artifact/org.apache.spark/spark-sql_2.10/1.0.0

$ find .
.
./build.sbt
./src
./src/main
./src/main/scala
./src/main/scala/SimpleApp.scala
sbt目录格式要求见官方文档 https://www.scala-sbt.org/1.x/docs/Directories.html
src/
main/
resources/
<files to include in main jar here>
scala/
<main Scala sources>
scala-2.12/
<main Scala 2.12 specific sources>
java/
<main Java sources>
test/
resources
<files to include in test jar here>
scala/
<test Scala sources>
scala-2.12/
<test Scala 2.12 specific sources>
java/
<test Java sources>
使用sbt打包
# 打包
$ sbt package
...
[success] Total time: s (:), completed -- ::
# jar包位于 target/scala-2.12/simple-application_2.-1.0.jar
4)提交并执行Spark任务
$ bin/spark-submit --class "SimpleApp" --master spark://xxx:7077 ../scala-tests/SimpleApp/target/scala-2.12/simple-application_2.12-1.0.jar
# 报错:Caused by: java.lang.ClassNotFoundException: scala.runtime.LambdaDeserialize
# 参考:https://stackoverflow.com/questions/47172122/classnotfoundexception-scala-runtime-lambdadeserialize-when-spark-submit
# 这是spark版本和scala版本不匹配导致的
查询spark所使用的scala的版本
$ bin/spark-shell --master spark://xxx:7077 scala> util.Properties.versionString
res0: String = version 2.11.

$ bin/spark-submit --class "SimpleApp" --master spark://xxx:7077 ../scala-tests/SimpleApp/target/scala-2.11/simple-application_2.11-1.0.jar
Lines with a: , Lines with b:
Spark文档阅读之二:Programming Guides - Quick Start的更多相关文章
- Spring 4.3.11.RELEASE文档阅读(二):Core Technologies_IOC
在看这部分内容的时候,想了一些问题: 容器: 1,什么是容器 用来包装或装载物品的贮存器 2,容器能做什么 包装或装载物品 3,为什么需要容器 为什么要使用集装箱?如果没有容器会是什么样? 4,常见的 ...
- Spark文档阅读之一:Spark Overview
Document: https://spark.apache.org/docs/latest/index.html 版本:2.4.5 1. spark的几种执行方式 1)交互式shell:bin/ ...
- Spring 4.3.11.RELEASE文档阅读(二):Core Technologies_AOP
虽然并不是每个问题都有答案,但我想了很多问题.so, just write it down , maybe one day...... AOP: 1,AOP是啥 2,AOP思想是怎么产生的 3,AOP ...
- 转:苹果Xcode帮助文档阅读指南
一直想写这么一个东西,长期以来我发现很多初学者的问题在于不掌握学习的方法,所以,Xcode那么好的SDK文档摆在那里,对他们也起不到什么太大的作用.从论坛.微博等等地方看到的初学者提出的问题,也暴露出 ...
- Node.js的下载、安装、配置、Hello World、文档阅读
Node.js的下载.安装.配置.Hello World.文档阅读
- 我的Cocos Creator成长之路1环境搭建以及基本的文档阅读
本人原来一直是做cocos-js和cocos-lua的,应公司发展需要,现转型为creator.会在自己的博客上记录自己的成长之路. 1.文档阅读:(cocos的官方文档) http://docs.c ...
- Keras 文档阅读笔记(不定期更新)
目录 Keras 文档阅读笔记(不定期更新) 模型 Sequential 模型方法 Model 类(函数式 API) 方法 层 关于 Keras 网络层 核心层 卷积层 池化层 循环层 融合层 高级激 ...
- Django文档阅读-Day1
Django文档阅读-Day1 Django at a glance Design your model from djano.db import models #数据库操作API位置 class R ...
- Django文档阅读-Day2
Django文档阅读 - Day2 Writing your first Django app, part 1 You can tell Django is installed and which v ...
随机推荐
- 决策树purity/基尼系数/信息增益 Decision Trees
目录 决策树简单描述 衡量purity的三种方法 Gini Coefficient Entropy熵 决策树简单描述 决策树的样子大概是这个样子的: 选择一个特征作为根节点,把这个特征划分成两个孩子节 ...
- iOS 的尾调用优化原理
背景: 今天聊代码规范的问题的时候说了一下尾调用的问题. 一:概念: 什么是尾调用? 尾调用(Tail Call):某个函数的最后一步仅仅只是调用了一个函数(可以是自身,可以是另一个函数). 注意 “ ...
- PHP文件上传案例和函数
$_FILES参数详解: $_FILES["file"]["name"] – 被上传文件的名称 $_FILES["file"][" ...
- EF用导航熟悉遍历从表时,删除主表出错
var entitys= Repository.Table.Where(a => ids.Contains(a.UUID)).ToList(); entitys.ForEach(a => ...
- .Net Core之仓储(Repository)模式
我们经常在项目中使用仓储(Repository)模式,来实现解耦数据访问层与业务层.那在.net core使用EF core又是怎么做的呢? 现在我分享一下我的实现方案: 一.在领域层创建Reposi ...
- sqlmap基本使用
sqlmap 使用 需要安装python2的环境 使用方法: 用最基础的get型注入开始 1.当我们发现注入点的时候, python sqlmap.py -u "http://192.168 ...
- eatwhatApp开发实战(十四)
之前我们就输入框EditText做了优化,而这次,我们为app添加拨打电话的功能. 首先是布局,将activity_shop_info.xml中对应的电话那一栏进行重新设计: <Relative ...
- Could not find the Qt platform plugin windows错误解决方法
在PyCharm中运行PyQt5窗口程序时,出现了下图所有的错误提示. 出现该问题的原因是环境变量没有添加. 解决方法:在环境变量中增加:QT_QPA_PLATFORM_PLUGIN_PATH 路径: ...
- jchdl - RTL Block
https://mp.weixin.qq.com/s/pR6b6i98P9dRU8bhZkKaww 观察Verilog代码可以发现,对逻辑的描述中都是assign和always代码块.这正对应了硬 ...
- Java面向对象 类与对象与方法的储存情况
栈.堆.方法区 类(含方法)储存在方法区 main函数入栈 堆里面存储方法区中类与方法的地址 main函数调用方法,找堆里面方法的地址,再从方法区找到对应函数,函数入栈,用完出栈 总结: 1.类.方法 ...