Spark的实际应用方法:每一个Spark驱动程序应用都由一个驱动程序组成,而每一个驱动程序都包含一个由用户编写的main方法。

                                          我们只需要编写main函数来实现相关操作。此处




初始化Spark:

  使用Java来编写Spark程序的时候都需要先创建JavaSparkContext

   

SparkConf conf = new SparkConf().setAppName(appName).setMaster(master);
JavaSparkContext sc = new JavaSparkContext(conf);

也可以使用Spark Shell 从而不用创建SparkContext.

RDDs(弹性分布式数据集):

     主要是一个有容错机制的元素容器名,主要是进行并行操作

        获得RDD的两种方式:

  • 通过并行化驱动程序中已有的一个集合而获得
  • 通过外部存储系统(例如共享的文件系统、HDFS、HBase等)的数据集进行创建

并行集合:

        在驱动程序中,一个已存在的集合上调用SparkContext的parallelize方法可以创建一个并行集合。

复制到一个可被并行操作的分布式数据集中

外部数据库:

            

Spark可以通过Hadoop支持的外部数据源创建分布式数据集,
Hadoop支持的数据源有本地文件系统、HDFS、Cassandra、HBase、
Amazon S3、Spark支持的文本文件、SequenceFiles、Hadoop InputFormat。



           同时SparkContext的testFiles 方法可以创建文本文件RDD,读取文本文件的每一行至容器中。


       RDD操作:

  • transformation:从一个RDD转换为一个新的RDD。
  • action:基于一个数据集进行运算,并返回RDD。


       Spark的API,在很大程度上依赖于把驱动程序中的函数传递到集群上运行。在Java中,函数由那些实现了org.apache.spark.api.java.function包中的接口的类表示。有两种创建这样的函数的方式:

  • 在自己的类中实现Function接口,可以是匿名内部类,或者命名类,并且传递类的一个实例到Spark。
  • 在Java8中,使用lambda表达式来简明地定义函数的实现。
Spark常用的transformation操作:

map(func)

将原来RDD的每个数据项,使用map中用户自定义的函数func进行映射,转变为一个新的元素,并返回一个新的RDD。

filter(func)

使用函数func对原RDD中数据项进行过滤,将符合func中条件的数据项组成新的RDD返回。

flatMap(func)

类似于map,但是输入数据项可以被映射到0个或多个输出数据集合中,所以函数func的返回值是一个数据项集合而不是一个单一的数据项。

mapPartitions(func)

类似于map,但是该操作是在每个分区上分别执行,所以当操作一个类型为T的RDD时func的格式必须是Iterator<T> => Iterator<U>。即mapPartitions需要获取到每个分区的迭代器,在函数中通过这个分区的迭代器对整个分区的元素进行操作。

mapPartitionsWithIndex(func)

类似于mapPartitions,但是需要提供给func一个整型值,这个整型值是分区的索引

sample(withReplacement, fraction, seed)

对数据采样。用户可以设定是否有放回(withReplacement)、采样的百分比(fraction)、随机种子(seed)。

union(otherDataset)

返回原数据集和参数指定的数据集合并后的数据集。使用union函数时需要保证两个RDD元素的数据类型相同,返回的RDD数据类型和被合并的RDD元素数据类型相同。该操作不进行去重操作,返回的结果会保存所有元素。如果想去重,可以使用distinct()。

intersection(otherDataset)

返回两个数据集的交集。

distinct([numTasks]))

将RDD中的元素进行去重操作。

groupByKey([numTasks])

操作(K,V)格式的数据集,返回 (K, Iterable)格式的数据集。

注意,如果分组是为了按key进行聚合操作(例如,计算sum、average),此时使用reduceByKeyaggregateByKey计算效率会更高。

注意,默认情况下,并行情况取决于父RDD的分区数,但可以通过参数numTasks来设置任务数。

reduceByKey(func, [numTasks])

使用给定的func,将(K,V)对格式的数据集中key相同的值进行聚集,其中func的格式必须为(V,V) => V。可选参数numTasks可以指定reduce任务的数目。

aggregateByKey(zeroValue)(seqOp, combOp,[numTasks])

对(K,V)格式的数据按key进行聚合操作,聚合时使用给定的合并函数和一个初试值,返回一个(K,U)对格式数据。需要指定的三个参数:zeroValue为在每个分区中,对key值第一次读取V类型的值时,使用的U类型的初始变量;seqOp用于在每个分区中,相同的key中V类型的值合并到zeroValue创建的U类型的变量中。combOp是对重新分区后两个分区中传入的U类型数据的合并函数。

sortByKey([ascending], [numTasks])

(K,V)格式的数据集,其中K已实现了Ordered,经过sortByKey操作返回排序后的数据集。指定布尔值参数ascending来指定升序或降序排列。

join(otherDataset, [numTasks])

用于操作两个键值对格式的数据集,操作两个数据集(K,V)和(K,W)返回(K, (V, W))格式的数据集。通过leftOuterJoinrightOuterJoinfullOuterJoin完成外连接操作。

cogroup(otherDataset, [numTasks])

用于操作两个键值对格式数据集(K,V)和(K,W),返回数据集格式为 (K,(Iterable, Iterable)) 。这个操作也称为groupWith。对在两个RDD中的Key-Value类型的元素,每个RDD相同Key的元素分别聚合为一个集合,并且返回两个RDD中对应Key的元素集合的迭代器。

cartesian(otherDataset)

对类型为T和U的两个数据集进行操作,返回包含两个数据集所有元素对的(T,U)格式的数据集。即对两个RDD内的所有元素进行笛卡尔积操作。

pipe(command, [envVars])

以管道(pipe)方式将 RDD的各个分区(partition)使用 shell命令处理(比如一个 Perl或 bash脚本)。 RDD的元素会被写入进程的标准输入(stdin),将进程返回的一个字符串型 RDD(RDD of strings),以一行文本的形式写入进程的标准输出(stdout)中。

coalesce(numPartitions)

把RDD的分区数降低到通过参数numPartitions指定的值。在得到的更大一些数据集上执行操作,会更加高效。

repartition(numPartitions)

随机地对RDD的数据重新洗牌(Reshuffle),从而创建更多或更少的分区,以平衡数据。总是对网络上的所有数据进行洗牌(shuffles)。

repartitionAndSortWithinPartitions(partitioner)

根据给定的分区器对RDD进行重新分区,在每个结果分区中,按照key值对记录排序。这在每个分区中比先调用repartition再排序效率更高,因为它可以将排序过程在shuffle操作的机器上进行。


Spark常用的Actions操作:

reduce(func)

使用函数func聚集数据集中的元素,这个函数func输入为两个元素,返回为一个元素。这个函数应该符合结合律和交换了,这样才能保证数据集中各个元素计算的正确性。

collect()

在驱动程序中,以数组的形式返回数据集的所有元素。通常用于filter或其它产生了大量小数据集的情况。

count()

返回数据集中元素的个数。

first()

返回数据集中的第一个元素

take(n)

返回数据集中的前n个元素。

takeSample(withReplacement,num, [seed])

对一个数据集随机抽样,返回一个包含num个随机抽样元素的数组,参数withReplacement指定是否有放回抽样,参数seed指定生成随机数的种子。

takeOrdered(n, [ordering])

返回RDD按自然顺序或自定义顺序排序后的前n个元素。

saveAsTextFile(path)

将数据集中的元素以文本文件(或文本文件集合)的形式保存到指定的本地文件系统、HDFS或其它Hadoop支持的文件系统中。Spark将在每个元素上调用toString方法,将数据元素转换为文本文件中的一行记录。

saveAsSequenceFile(path)

将数据集中的元素以Hadoop Sequence文件的形式保存到指定的本地文件系统、HDFS或其它Hadoop支持的文件系统中。该操作只支持对实现了Hadoop的Writable接口的键值对RDD进行操作。

saveAsObjectFile(path)

将数据集中的元素以简单的Java序列化的格式写入指定的路径。这些保存该数据的文件,可以使用SparkContext.objectFile()进行加载。

countByKey()

仅支持对(K,V)格式的键值对类型的RDD进行操作。返回(K,Int)格式的Hashmap,(K,Int)为每个key值对应的记录数目。

foreach(func)

对数据集中每个元素使用函数func进行处理。该操作通常用于更新一个累加器(Accumulator)或与外部数据源进行交互。


RDD可以使用persist()方法或cache()方法进行持久化


移除数据可以使用RDD.unpersist()方法。