首先启动HDFS集群:
start-dfs.sh
然后启动Spark集群:
./sbin/start-all.sh
最后以让spark-shell运行在Spark集群上:
./bin/spark-shell
因为我这里是单机版的,所以是上面的输入,不需要指定端口号
假定你已经上传了一个文件到HDFS中,读取该文件:
val rdd=sc.textFile("/input/nihao")
使用count统计一下该文件的行数:
rdd.count
下面对该RDD进行cache操作并执行count使得缓存生效:
rdd.cache
rdd.count
当你再次执行count时,你会发现时间变少了
对上面的rdd进行wordcount操作:
val wordcount =rdd.flatMap(x=>x.split(' ')).map(x=>(x,1)).reduceByKey((A,B)=>(A+B))
可以简写为:
val wordcount =rdd.flatMap(_.split(' ')).map(_,1).reduceByKey(_+_)
flatMap:将原来的RDD中的每个元素通过函数f转换为新的元素,并将生成的RDD的每个集合中的元素合并为一个集合。
x=>x.split(’ ‘) :x代表读进来的每一行,将其转换为根据空格切分后的单词组
map :是对每个数据项进行转换操作。x=>(x,1) 将每个单词变为key-value对,值为1
reduceByKey :对key-value对的value进行操作,将相同的key的两个值合并为新的值。
(A,B)=>(A+B) :将两个值相加
wordcount.collect
wordcount.saveAsTextFile("/o")
从wordcount的的输出结果可以看出其执行结果是未经排序的,若要排序则可以如下:
val wordcount =rdd.flatMap(x=>x.split(' ')).map(x=>(x,1)).reduceByKey((A,B)=>(A+B)).map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1)).saveAsTextFile("/o3")
x=>(x._2,x._1) :x已经是key-value对类型了,此操作是将它的key,value调换一下
sortByKey :此函数是根据key进行排序,false是降序,不填是升序
上一步做完之后,要将key,value再次调换一下