1.spark-shell是Spark的命令行界面,使用Spark-shell进入scala命令行;
spark的基础数据类型是RDD,即Resillient Distributed Dataset弹性分布式数据集,假设分布式系统下有很多的文件,这些文件有很多的行,RDD指的就是所有这些文件所有行的集合,而不是单独的某一行,所以我们对RDD进行的一系列操作都是对整个集合进行的操作,并且Spark是将整个RDD放到内存中进行处理的,而不是像MR那样放在磁盘中。
2.spark中一切皆为对象,对象皆有方法
val和var 均为变量
val 不可变变量,类似java中的final
var可变变量
3.Spark中的操作
Spark RDD支持两种操作:转换和行动操作;
spark的转换操作是懒操作,即先记录后期真正用时(有行动操作时)再执行;
转换操作就是把一种RDD转换为另一种RDD;
行动操作是实际地产生一种结果;
这样安排的意义,Spark的所有RDD都存在内存上非常的追求速度,所以要尽量减少RDD转换的次数。使用懒操作可以把整个RDD转换过程中可以合并的步骤合并起来执行,
常用的转换操作:
flatmap返回的是集合内的元素;相当于先做map返回一个RDD[集合[B]],在做flat返回RDD[B]
filter对输入的RDD中的每一个元素,通过一个函数做判断,过滤掉结果为假的元素;
distinct对RDD中的元素做去重操作
coalesce将RDD进行重新分区,使用HashPartitioner.
eg: val rddnew=rddold.coalesce(n); //对老的rdd重新分区;rddnew.partitions.size //查看rdd的分区数
当新分区数大于老的rdd分区数时,要指定suffle为true eg: val rddnew=rddold.coalesce(n,true)
repartition内置了coalesce的shuffle,true eg:repartition(n)
randomSplit 将RDD切分成多个RDD,两个参数,一、权重是双精度浮点数数组,正常情况下该数组的和应等于1;二、随机数种子,写一个整数;
作用:用来把一份数据分成几份,比如我们做推荐系统,会把数据按照权重分成训练数据和测试数据;
union将两个结构相同的RDD合并在一起,合并后的RDD可能包含重复的元素;类似的还有intersection返回两个RDD的交集;subtract返回在RDD中出翔在其他的RDD中不出现的元素;
zipWithIndex产生一个键值对,键是RDD的元素,值是从零开始的ID值;
http://blog.csdn.net/Trigl/article/details/70853280
spark scala命令行界面下执行wordcount命令;
总代码,如下:
1 val textFile = sc.textFile("file:/home/training/training_materials/data/frostroad.txt") 2 val wordCounts = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b) 3 wordCounts.collect()第一行,读取目录/home/training/training_materials/data/下的frostroad.txt文件;
val textFile=sc.textFile("path"); //读取原始数据并转化为Spark自己的数据格式RDD,一般读取原始数据有两种方式,上面的一种和下面的:
1.调用SparkContext的parallelize方法:
val rdd=sc.parallelize(Array(1 to 10)) //获取一个1到10的数组,用于测试程序,正式开发不用这种
2.所有Hadoop可以使用的数据源Spark都可以使用,当然我们最常用的还是SparkContext的textFile方法,读取hdfs上的文件有:
val rdd=sc.parallelize("hadoop://user/hive/test.log")
第二行,计算文本中的单词出现的次数
val wordCounts = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)flatmap,map,reduceByKey都是RDD的转化操作;collect是RDD的行动操作;