一、安装
1.下载二进制压缩包
http://www.scala-lang.org/downloads
2.移动至:/usr/local/share
sudo mv scala-2.12.1.tgz /usr/local/share
3.解压
cd /usr/local/share
sudo tar zxf scala-2.12.1.tgz
4.配置
4.1-打开配置文件
sudo gedit /etc/profile
4.2-添加scala路径配置
# Scala config
export SCALA_HOME="/usr/local/share/scala-2.12.1"
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$SPARK_HOME/bin:$SPARK_HOME/sbin:$SCALA_HOME/bin
4.3-使配置生效
source /etc/profile
5.测试是否成功
cd ~
scala-version
如果安装成功则会输出类似一下内容
Scala code runner version 2.12.1 -- Copyright 2002-2016, LAMP/EPFL and Lightbend, Inc.
安装成功后可以简单地通过 Spark 交互式shell bin/spark-shell开始一个 Scala shell,或bin/pyspark开始一个 Python shell。
二、转换(transformations)
在 Spark 中,所有的转换(transformations)都是惰性(lazy)的,它们不会马上计算它们的结果。相反的,它们仅仅记录转换操作是应用到哪些基础数据集(例如一个文件)上的。转换仅仅在这个时候计算:当动作(action) 需要一个结果返回给驱动程序的时候。这个设计能够让 Spark 运行得更加高效。例如,我们可以实现:通过
map 创建一个新数据集在
reduce 中使用,并且仅仅返回
reduce 的结果给 driver,而不是整个大的映射过的数据集。
下面的表格列了Spark支持的一些常用 transformations。
转换 | 作用 |
---|---|
map(func) | 返回一个新的分布式数据集,它将数据源的每个元素传递给函数func映射。 |
filter(func) | 返回一个新的数据集,从数据源中选中一些通过函数 func过滤的元素。 |
flatMap(func) | 类似于 map,但是每个输入项能被映射成多个输出项(所以 func 必须返回一个序列,而不是单个 item)。 |
mapPartitions(func) | 类似于 map,但是分别运行在 RDD 的每个分区上,所以 func 的类型必须是 Iterator<T> => Iterator<U>。 |
mapPartitionsWithIndex(func) | 类似于 mapPartitions,但是 func 需要提供一个 integer 值描述索引(index),所以 func 的类型必须是 (Int, Iterator) => Iterator。 |
sample(withReplacement, fraction, seed) | 对数据进行采样。 |
union(otherDataset) | 返回一个新的数据集,其中包含源数据集和参数中元素的并集。 |
intersection(otherDataset) | 返回一个包含源数据集和参数中的元素交集的新RDD。 |
distinct([numTasks])) | 返回包含源数据集的不同元素的新数据集。 |
groupByKey([numTasks]) | 当在(K,V)键值对的数据集上调用时,返回(K,Iterable)键值对的数据集。 注意:如果要进行分组以便对每个键执行聚合(如求总和或求平均值),使用reduceByKey或combineByKey将产生更好的性能。 默认情况下,输出中的并行性级别取决于父RDD的分区数。 您可以传递可选的numTasks参数,以设置不同数量的任务。 |
reduceByKey(func, [numTasks]) | 当在(K,V)键值对的数据集上调用时,返回(K,V)键值对的数据集,其中使用给定的reduce函数func聚集每个键的值,其必须是类型(V,V)=> V.像groupByKey一样,reduce任务的数量可以通过可选的第二个参数来配置。 |
aggregateByKey(zeroValue)(seqOp, combOp, [numTasks]) | 当在(K,V)键值对的数据集上调用时,返回(K,U)键值对的数据集,其中使用给定的组合函数和中性“零”值来聚合每个键的值。 允许与输入值类型不同的聚合值类型,同时避免不必要的分配。 像groupByKey中一样,reduce任务的数量可以通过可选的第二个参数来配置。 |
sortByKey([ascending], [numTasks]) | 当对(K,V)键值对的数据集(其中K实现Ordered)调用时,返回按升序或降序按键排序的(K,V)键值对的数据集。 |
join(otherDataset, [numTasks]) | 当调用(K,V)和(K,W)类型的数据集时,返回具有每个键的所有元素对的(K,(V,W))键值对的数据集。 外部联接也通过leftOuterJoin和rightOuterJoin支持。 |
cogroup(otherDataset, [numTasks]) | 当调用(K,V)和(K,W)类型的数据集时,返回(K,Iterable,Iterable)元组的数据集。 此操作也称为groupWith。 |
cartesian(otherDataset) | 当调用T和U类型的数据集时,返回(T,U)对(所有元素对)的数据集。 |
pipe(command, [envVars]) | 通过shell命令管道RDD的每个分区,例如。 一个Perl或bash脚本。 RDD元素被写入进程的stdin,并且以行的形式输出到其stdout作为字符串的RDD返回。 |
coalesce(numPartitions) | 将RDD中的分区数减少到numPartitions。用于过滤掉大型数据集后更有效地运行操作。 |
repartition(numPartitions) | 随机重新刷新RDD中的数据以创建更多或更少的分区,并在它们之间进行平衡。 这总是在网络上刷新所有数据。 |
三、动作(actions)
在 Spark 中,动作(actions) 在数据集上进行计算之后返回一个值到驱动程序。
在 Spark 中,动作(actions) 在数据集上进行计算之后返回一个值到驱动程序。
下面的表格列了Spark支持的一些常用 actions。
转换 | 作用 |
---|---|
reduce(func) | 使用函数func(它接受两个参数并返回一个)聚合数据集的元素。 函数应该是可交换和关联的,以便它可以被正确地并行计算。 |
collect() | 在驱动程序中将数据集的所有元素作为数组返回。 这在返回足够小的数据子集的过滤器或其他操作之后通常是有用的。 |
count() | 返回数据集中的元素数。 |
first() | 返回数据集的第一个元素(类似于take(1))。 |
take(n) | 返回数组中前n个元素的数组。 注意,这当前不是并行执行的,是驱动程序计算所有元素。 |
takeSample(withReplacement, num, [seed]) | 返回具有数据集的num个元素的随机样本的数组,具有或不具有替换,可选地预指定随机数生成器种子。 |
takeOrdered(n, [ordering]) | 使用它们的自然顺序或自定义比较器返回RDD的前n个元素。 |
saveAsTextFile(path) | 将数据集的元素作为文本文件(或一组文本文件)写入本地文件系统,HDFS或任何其他Hadoop支持的文件系统中的给定目录中。 Spark将对每个元素调用toString将其转换为文件中的一行文本。 |
saveAsSequenceFile(path) (Java and Scala) | 将数据集的元素作为Hadoop SequenceFile写入本地文件系统,HDFS或任何其他Hadoop支持的文件系统中的给定路径中。 这可以在实现Hadoop的Writable接口的键值对的RDD上使用。 在Scala中,它也可以隐式转换为Writable类型(Spark包括基本类型的转换,如Int,Double,String等)。 |
saveAsObjectFile(path) (Java and Scala) | 使用Java序列化以简单的格式编写数据集的元素,然后可以使用SparkContext.objectFile()加载它。 |
countByKey() | 仅适用于(K,V)类型的RDD。 返回具有每个键的计数的(K,Int)键值对的哈希表。 |
foreach(func) | 对数据集的每个元素运行函数func。 |