先测试搭好的spark集群:
本地模式测试:
在spark的目录下:
./bin/run-example SparkPi 10 --master local[2]
验证成功:
集群模式 Spark Standalone:
spark-shell --master yarn-client 集群模式Spark Standalone
验证成功:
集群模式 Spark on Yarn集群上yarn-cluster模式:
./bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn-cluster examples/jars/spark-examples_2.11-2.0.2.jar 10
实现一个wordcount将文件导入scala中:
先尝试一下map函数,map不改变数据的结构,但可以对数据进行操作
相当于对每个值,做了乘2的操作。
用空格分隔
将每一行用空格做分隔。
简化,_是通配符,代表每个x
将map之后的数据打平,等价于 lines.map(x=>x.split(" ")).flatten
将每个单词后面加一个“1”字符,
groupby操作
从tuple(forgotten,1)中把第一个单词提出来forgotten作为key,
把整个tuple作为value,收集到一个list中
这样对应的value是一个list里面包含所有对应key的tuple
例:
_1:forgotten -> _2:List((forgotten,1), (forgotten,1), (forgotten,1))
整个list大小就是对应key:forgotten出现的次数
下方的map(x=>(x._1,x._2.length)) 只能用这种形式因为是两个tunple.当中的length也可换成size.
如果不通过list大小来算具体单词的次数(词频):
要将map中读的list中的第二个值相加.,也可以把sum改成reduce(_+_)
reduce(_+_)计算原理:
List(1, 1, 1) ((1+1)+1)
sum += x
按数字反向排序:
取前三个:
其他方法:
lines.flatMap(_.split(" ")) .map((_,1)) .groupBy(_._1) .mapValues(_.size) 返回的是一个Map(dict),key:单词,value:词频 lines.flatMap(_.split(" ")) .map((_,1)) .groupBy(_._1) .mapValues(_.size) .toArray .sortWith(_._2>_._2) .slice(0,10) sortBy(_._2).reverse == sortWith(_._2>_._2) _._2表示按照第二个进行排序
mkString(拼接字符串)
正则去取多余的符号
正则: python import re p = r'[0-9]+' p.findall(s)这个是一个数组 p.findall(s)[0] scala: val p = "[0-9]+".r val s = "546465sfgidg" p.findAllIn(s)是一个迭代器 p.findAllIn(s).toArray 将迭代器转为数组形式. p.findAllIn(s).foreach(x=>println(x)) foreach也是扫一遍数据 p.findAllIn(s).mkString("") #变成字符串 mkString("[","","]") 取标点,只取数字和字符 val p = "[0-9a-zA-Z]+".r lines.flatMap(_.split(" ")) .map(x=>(p.findAllIn(x).mkString(""),1)) .groupBy(_._1) .mapValues(_.size) .toArray .sortWith(_._2>_._2) .slice(0,10) lines.flatMap(_.split(" ")).map(x=>(p.findAllIn(x).mkString(""),1))
fold函数:
def f(){} lines.map(f) a.foldLeft(0)(_+_) sum = 0 for i in a: sum += i return sum tuple求和 sum = 0 for i in a: sum += i[1] #1相当于第二个值,相当于scala中的_.__2 return sum a.foldLeft(0)(_+_._2) #_._2是第二个,0没有变.0相当于sum=0
map的嵌套操作;