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 ...
随机推荐
- C# 使用RestClient 调用接口
最近做项目使用RestClient 向第三方接口推送数据.不废话直接贴代码 /// <summary> /// 获取Token /// </summary> /// <r ...
- 【谎言大揭秘】Modin真的比pandas运行更快吗?
最近看了某公众号文章,推荐了所谓的神器,据说读取速度吊打pandas,可谓牛逼,事实真是这样吗? 来一起揭秘真相. 首先安装包. # pip install ray # pip install das ...
- CSS基础选择器总结
基础选择器 作用 特点 使用情况 用法 标签选择器 可以选出所有相同的标签,比如p 不能差异化选择 较多 p {color:red;} 类选择器 可以选出1个或多个标签 可以根据需求选择 非常多 .n ...
- S32K142学习记录_day1
因为项目的原因接触了NXP的S32K142芯片 从官网上download S32DS 安装 找数据手册 发现都是英文的只能看着翻译了 今天看的是关于clock配置的 当clock需要进行切换的时候必须 ...
- 抽象类(abstract class)与抽象方法
package cm.aff.abst; /* abstract:抽象的,,可以修饰类,方法 1.修饰类: 抽象类: ①不能被实例化 ②有构造器的 ③凡是类都有构造器 ④抽象方法所修饰的类一定是抽象类 ...
- linux:基本指令
指令标准格式 指令主体 [选项][操作对象] 基础指令 ls 1.ls 列出当前工作目录下的所有文件/文件夹的名称 2.ls 路径 列出指定路径下的所有文件/文件夹的名称 路径: 1.相对路径 会用 ...
- PAT1065 单身狗 (25分) 思路记录——参考大神柳婼
1065 单身狗 (25分) “单身狗”是中文对于单身人士的一种爱称.本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱. 输入格式: 输入第一行给出一个正整数 N(≤ 50 000), ...
- 【JAVA习题十五】两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
package erase; public class 选人比赛 { public static void main(String[] args) { // TODO Auto-generated m ...
- Rocket - debug - TLDebugModuleInner
https://mp.weixin.qq.com/s/jkiHceU0HaJbHGvHiU-QOA 简单介绍TLDebugModuleInner的实现. 1. 引入全局配置 1) cfg 引入Debu ...
- Chisel3 - Tutorial - ShiftRegister
https://mp.weixin.qq.com/s/LKiXUgSnt3DzgFLa9zLCmQ 简单的寄存器在时钟的驱动下,逐个往下传值. 参考链接: https://github.com ...