您的位置:首页 > 其它

好久不更新博客,关于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**
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: