scala>var f1=sc.textFile("/tmp/dataTest/followers.txt")
scala>f1.flatMap(x=>x.split("-")).map((_,1)).collect //每个数字以'-'分割,并数字为key,给每个key赋值1
res10: Array[(String, Int)] = Array((2,1), (1,1), (4,1), (1,1), (1,1), (2,1), (6,1), (3,1), (7,1), (3,1), (7,1), (6,1), (6,1), (7,1), (3,1), (7,1)
reduceByKey(_+_).collect 将key相同元素合并(4出现一次,7出现4次,6出现3次,2出现2次,3出现3次,1出现3次)
scala>f1.flatMap(x=>x.split("-")).map((_,1)).reduceByKey(_+_).collect
res12: Array[(String, Int)] = Array((4,1), (7,4), (6,3), (2,2), (3,3), (1,3))
这个方法也是同样效果
scala>f1.flatMap(x=>x.split("-")).map((_,1)).reduceByKey((x,y)=>x+y).collect
res18: Array[(String, Int)] = Array((4,1), (7,4), (6,3), (2,2), (3,3), (1,3))
对出现的次数进行排序
sortByKey
scala>var resText=f1.flatMap(x=>x.split("-")).map((_,1)).reduceByKey(_+_).map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1))
resText: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[39] at map at <console>:26
scala编译后的文件是以.class结尾。开头包含类似package声明的scala代码直接在scala命令行用:load指令加载会出错。如果在scala命令行想调用自己在ide写好的类时(大多数情况下你的类会用到外部包,比如spark之类的),有三种方法:将你在ide写好的project在scala下进行编译,之后通过Main调用。打包整个项目为jar,通过scala -classpath加载后,在scala中import进行调用。去掉package声明,并且将依赖包通过scala -classpath加载后,再使用:load 加载你的内容。scala中执行外部命令(scala.sys.process)发表回复
目前 scala.sys.process 已经封装的足够简单。参考: http://itang.iteye.com/blog/1126777
scala>import scala.sys.process._
// 只需在结尾用!号,就表示执行外部命令
scala>val list = "ls -l" !
还可以重定向,甚至可以在java对象与命令之间:
scala>new java.net.URL( " http://www.iteye.com ") #>
new java.io.File("/tmp/iteye.html") !
注意,重定向必须用 new java.io.File("") 封装,否则会当作命令,比如
scala>"ls" #>"/tmp/a" !
将会出错,必须
scala>"ls" #>new java.io.File("/tmp/a") !
管道的用法:
scala>val list = "ls -l" #| "grep P" !
不能在命令表达式中直接用管道, 比如 "ls | grep XXX" 这样不灵,必须用 #| 声明。
更多参考: https://github.com/harrah/xsbt/wiki/Process
//2012.6.15
要把System.getProperties 里的内容重定向到一个文件如何实现?
下面的方法不行,它会将第一个表达式的结果当作命令来执行
scala> System.getProperties.toString #>new java.io.File("/tmp/env") !
直接将文字重定向到一个文件,我现在还不知道怎么做。只能变通用写文件的啰嗦方式。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)