好久不更新博客,关于spark-scala上开发的总结
2017-11-25 22:08
351 查看
很久一段时间没有更新博客了,因为实验室项目(我真不是学cs的)的原因耽搁了一阵,主要在实习的地方做一个基于spark的大流量自然语言处理的项目,这里主要是一些注意事项和总结,不分先后:
1. 对于共享变量
举个例子,你的一个模型是LR或者是其他,那么矩阵系数w是一个大矩阵,如何将这个矩阵放到每个executor,方便计算和处理,目前我是用的是driver读入数据,然后broadcast,然后在map里面的函数调用这个变量使用xxx.value
举例:
val bc_paramatrx = spark.sparkContext.broadcast(paramatrx)
xxx.map(line =>{
…
line_cls = Utils.line2cls(input_line:String,bc_paramatrx.value, … })
2. 对于for循环,until和to混写要小心
for循环里的to和until,拿一个例子来看,until取不到右边界,to能取到右边界:
scala> val test_s=”2-1-”
test_s: String = 2-1-
scala> val test_a=test_s.split(“-“)
test_a: Array[String] = Array(2, 1)
scala> for(i <-0 to test_a.length){println(test_a(i))}
2
1
java.lang.ArrayIndexOutOfBoundsException: 2
at anonfun1.applymcVIsp(:61)
at scala.collection.immutable.Range.foreachmVcsp(Range.scala:160)
… 58 elided
scala> for(i <-0 to test_a.length-1){println(test_a(i))}
2
1
scala> for(i <-0 until test_a.length){println(test_a(i))}
2
1
3. 将数组转化为字符串
关于将数组转化为字符串,list好像不ok?
scala> val arr=Array(1,3,4,5)
arr: Array[Int] = Array(1, 3, 4, 5)
scala> val str=arr.mkString(“”)
str: String = 1345
scala> val arr=Array(“1”,”3”,”4”,”5”)
arr: Array[String] = Array(1, 3, 4, 5)
scala> val str=arr.mkString(“”)
str: String = 1345
scala> val str=arr.mkString(“-“)
str: String = 1-3-4-5
4. scala判断字符串长度
在python里面读入的文件,判断汉字的长度方法和scala不一样,python需要decode后len,得到约等于汉字个数;scala直接length
(1)在python里:
len(query.decode(‘utf-8’, ‘ignore’)) 这样子才是字符个数,否则是字节个数,下文中汉字加-一共10个,按utf-8格式,30个字节,加上一个”\t”应该是31个?
with open(file,”r”) as f:
… line=f.readline()
… print(line)
… print(len(line))
… print(len(line.decode(‘utf-8’, ‘ignore’)))
…
. 生活不好吃-生活好吃
31
13
(2)在scala里面:直接line.length
龙胆 大于-大鱼小鱼
10
龙脷叶 漫威-锤神索尔
11
5. scala中的split函数注意
split,对于读入的文件,python用split(“\t”),一个反斜杠,对应到scala要split(“\\t”),两个反斜杠;python用split(“?”),scala用split(“\\?”),加上两个反斜杠
scala> val b=a+”?”+”黄金甲”
b: String = 周杰伦?黄金甲
scala> b.split(“?”)
java.util.regex.PatternSyntaxException: Dangling meta character ‘?’ near index 0
?
^
at java.util.regex.Pattern.error(Pattern.java:1955)
at java.util.regex.Pattern.sequence(Pattern.java:2123)
at java.util.regex.Pattern.expr(Pattern.java:1996)
at java.util.regex.Pattern.compile(Pattern.java:1696)
at java.util.regex.Pattern.(Pattern.java:1351)
at java.util.regex.Pattern.compile(Pattern.java:1028)
at java.lang.String.split(String.java:2368)
at java.lang.String.split(String.java:2410)
… 50 elided
scala> b.split(“\\?”)
res132: Array[String] = Array(周杰伦, 黄金甲)
scala> val b=a+”\t”+” 甲”
b: String = 周杰伦 黄金甲
scala> b.split(“\t”)
res130: Array[String] = Array(周杰伦, 黄金甲)
但是读入文件的时候,使用split要用”\t”
另外,注意python里split(“\t”,1)表示切一次,对应scala表达为split(“\\t”,2),2表示切成2个,也就是切一次
PS:哈哈哈,自己打通了一整个项目(当然有jiong的帮忙),将原来需要几个小时的事情缩小到稳定一个小时,一千多行的代码,包括数据提取、解析、模型计算等等;
一个只有python代码功底(还是水平一般般的那种)的人到混写java和scala;
忍不住给自己鼓励一个!
**我的项目我起了个名字,Flash,帅不帅!
下一个项目我名字都起好了,Wonder_Woman**
1. 对于共享变量
举个例子,你的一个模型是LR或者是其他,那么矩阵系数w是一个大矩阵,如何将这个矩阵放到每个executor,方便计算和处理,目前我是用的是driver读入数据,然后broadcast,然后在map里面的函数调用这个变量使用xxx.value
举例:
val bc_paramatrx = spark.sparkContext.broadcast(paramatrx)
xxx.map(line =>{
…
line_cls = Utils.line2cls(input_line:String,bc_paramatrx.value, … })
2. 对于for循环,until和to混写要小心
for循环里的to和until,拿一个例子来看,until取不到右边界,to能取到右边界:
scala> val test_s=”2-1-”
test_s: String = 2-1-
scala> val test_a=test_s.split(“-“)
test_a: Array[String] = Array(2, 1)
scala> for(i <-0 to test_a.length){println(test_a(i))}
2
1
java.lang.ArrayIndexOutOfBoundsException: 2
at anonfun1.applymcVIsp(:61)
at scala.collection.immutable.Range.foreachmVcsp(Range.scala:160)
… 58 elided
scala> for(i <-0 to test_a.length-1){println(test_a(i))}
2
1
scala> for(i <-0 until test_a.length){println(test_a(i))}
2
1
3. 将数组转化为字符串
关于将数组转化为字符串,list好像不ok?
scala> val arr=Array(1,3,4,5)
arr: Array[Int] = Array(1, 3, 4, 5)
scala> val str=arr.mkString(“”)
str: String = 1345
scala> val arr=Array(“1”,”3”,”4”,”5”)
arr: Array[String] = Array(1, 3, 4, 5)
scala> val str=arr.mkString(“”)
str: String = 1345
scala> val str=arr.mkString(“-“)
str: String = 1-3-4-5
4. scala判断字符串长度
在python里面读入的文件,判断汉字的长度方法和scala不一样,python需要decode后len,得到约等于汉字个数;scala直接length
(1)在python里:
len(query.decode(‘utf-8’, ‘ignore’)) 这样子才是字符个数,否则是字节个数,下文中汉字加-一共10个,按utf-8格式,30个字节,加上一个”\t”应该是31个?
with open(file,”r”) as f:
… line=f.readline()
… print(line)
… print(len(line))
… print(len(line.decode(‘utf-8’, ‘ignore’)))
…
. 生活不好吃-生活好吃
31
13
(2)在scala里面:直接line.length
龙胆 大于-大鱼小鱼
10
龙脷叶 漫威-锤神索尔
11
5. scala中的split函数注意
split,对于读入的文件,python用split(“\t”),一个反斜杠,对应到scala要split(“\\t”),两个反斜杠;python用split(“?”),scala用split(“\\?”),加上两个反斜杠
scala> val b=a+”?”+”黄金甲”
b: String = 周杰伦?黄金甲
scala> b.split(“?”)
java.util.regex.PatternSyntaxException: Dangling meta character ‘?’ near index 0
?
^
at java.util.regex.Pattern.error(Pattern.java:1955)
at java.util.regex.Pattern.sequence(Pattern.java:2123)
at java.util.regex.Pattern.expr(Pattern.java:1996)
at java.util.regex.Pattern.compile(Pattern.java:1696)
at java.util.regex.Pattern.(Pattern.java:1351)
at java.util.regex.Pattern.compile(Pattern.java:1028)
at java.lang.String.split(String.java:2368)
at java.lang.String.split(String.java:2410)
… 50 elided
scala> b.split(“\\?”)
res132: Array[String] = Array(周杰伦, 黄金甲)
scala> val b=a+”\t”+” 甲”
b: String = 周杰伦 黄金甲
scala> b.split(“\t”)
res130: Array[String] = Array(周杰伦, 黄金甲)
但是读入文件的时候,使用split要用”\t”
另外,注意python里split(“\t”,1)表示切一次,对应scala表达为split(“\\t”,2),2表示切成2个,也就是切一次
PS:哈哈哈,自己打通了一整个项目(当然有jiong的帮忙),将原来需要几个小时的事情缩小到稳定一个小时,一千多行的代码,包括数据提取、解析、模型计算等等;
一个只有python代码功底(还是水平一般般的那种)的人到混写java和scala;
忍不住给自己鼓励一个!
**我的项目我起了个名字,Flash,帅不帅!
下一个项目我名字都起好了,Wonder_Woman**
相关文章推荐
- 好久没写博客了.把这几个月的开发过程做一个总结
- 好久没有更新了,该好好总结一下最近做过的开发了~~~
- 关于.net开发常见基本知识总结(每日更新)
- android开发关于打包一个总结(后续一直更新)
- PHP开发中遇到的关于PHP及JS跳转的方法总结
- 关于博客更新
- iOS中 项目开发易错知识点总结 韩俊强的博客
- 关于IOS开发中addSubView上去的viewController的viewWillAppear 和viewDidAppear 等调用的总结
- 关于Android支付宝的开发总结
- 敏捷开发实践总结(二):关于测试
- 关于android客户端在线版本更新的总结(json源码)
- 【总结+持续更新】超级有用的博客文章的链接汇总
- IOS开发(49)之关于 self与内存相关的用法总结
- 慢慢学Linux驱动开发,第三篇,关于printk的输出总结
- 新浪微博开发总结--关于tabButton的图片渲染问题
- 关于ArcGis开发问题总结
- 关于android开发环境中sdk和adt更新到22.6之后多了appcompat_v7和avd无法创建一个模拟器
- SAP接口开发--关于合同物料号与9位物料码关系接口问题总结
- iOS开发 关于SEL的简单总结
- 关于停止本博客更新以及新博客地址