很久一段时间没有更新博客了,因为实验室项目(我真不是学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 anonfun 1.apply mcVI sp(:61)
at scala.collection.immutable.Range.foreach mVc sp(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**