分布式机器学习:如何快速从Python栈过渡到Scala栈 (3)

ArrayBuffer是Array的变长版本;

列表 val list_x = List(1,2,3) println(0::list_x) // 0插入到list_x的第一个位置 println(0+:list_x) // 等价于:: println(list_x.::(0)) println(list_x.+:(0)) // 注意以上四种不管0在前还是后,都是插入到第一个位置 println(list_x :+ 4) println(list_x.:+(4)) // 所以区别是到底是+:还是:+ val list_y = List(4,5,6) println(list_x++list_y) // ++连接两个List println(list_x++:list_y) // ++:看起来跟++也是一样的嘛 // 可变List import scala.collection.mutable.ListBuffer val blist = ListBuffer(1,2,3) val blist2 = new ListBuffer[Int] blist += 4 blist.append(5) println(blist) blist2 ++= blist println(blist2)

列表的骚操作就比较多了:

比如各种::、:+、+:,看的头大。。。。大家还是朴实一点吧,不然过两天自己看代码都想死了。。。。

同样的ListBuffer是List的可变版本;

字典

字典在Scala中叫做映射;

val map1 = Map("k1"->10, 2->1.5, 3.3->"abc") println(map1) val map2 = Map((1,1),(2,2),(3,3)) println(map2) // 获取值的方式类似数组用下标 println(map1("k1"),map1(3.3),map1.get(2),map1.getOrElse(5,"default")) // Map默认是不可变的Map,也可以引入mutable包中的可变的Map import scala.collection.mutable.{Map=>MMap} val mmap = MMap((1,1),(2,2)) // map1(1) = 1 报错,Map不可变指的是其长度、元素都不能变 mmap(1)=mmap(1)+1 // map1 += (3 -> 3) 报错,因为原始Map不可变,+=会创建一个新的,但是map1又是常量 mmap += (3->3,4->4) println(mmap)

字典的差异:

有两种创建语法,个人喜欢第二种,更短一些;

Map不可变指的是它的元素个数、元素内容都不能变;

如果用var来定义一个不可变Map,那么看似可变,实际上是创建了一个新的Map对象;

元组 val tuple = (1,1.2,"abc") println(tuple._1,tuple._2,tuple._3) // 下面这种方式可以同时给元组中各个元素赋值到一个变量上 val tuple2,(name,age,score) = ("nemo",22,88.5) println(tuple2,name,age,score) // toMap+zip实现多个单Array到Map的映射 val names = Array("张三","李四","王五") val ages = Array(17,16,18) val scores = Array(80.5,77,90,100) // zip的结果长度为输入两个数组中短的那个 val infoes = names.zip(ages.zip(scores)).toMap println(infoes)

元组的特点不要过于明显:

可以通过tuple._n的方式来访问第n个元素,注意是从1开始的,说实话看呆我了,这到底有啥用。。。。

集合类都有类似toArray、toList、toMap、zip、unzip等方法可以进行互相转换;

Set val set = Set(1,1,2) println(set) val arr_set = Array(1,1,2,2) println(arr_set.toSet)

说实话我看到Set眼睛里只有去重两个字。。。

IO

首先很多时候我们用到也是java.io._库里的读写方法,比如PrintWriter、File等,不过Scala自己也有一套scala.io,看情况使用吧;

val path = "D:\\Project\\Data\\Scala\\hello.txt" val file_scala = Source.fromFile(path) file_scala.foreach { println } val file_java = new File(path) val writer = new PrintWriter(file_java) writer.write("Hello Scala") writer.close()

Scala读、Java写:

可以看到Scala中用java库基本一摸一样;

Scala的读文件结合foreach可以简化代码;

以上

Scala语言基础部分到底结束,以上内容不包含Scala的高级用法、代码优化、函数式编程、多线程等等,这些都是后续再去慢慢掌握的;

Spark本地开发环境搭建

这里主要分为以下几个步骤:

windows本地hadoop+spark环境搭建;

Idea基于Maven搭建Spark环境;

基本上都上网上找的资料,也算是踩过不少坑吧,环境问题有时候是比较烦人的,我也被一个Scala与Spark版本不对应问题浪费了几个小时。。。。大家要有耐心哈,有问题的讨论区留言,这里留下几个比较靠谱的参考链接:

IDEA配置Spark开发环境:https://www.jianshu.com/p/6a1b362b82e4

Windows下搭建Spark:https://www.cnblogs.com/xuliangxing/p/7279662.html

Hadoop资源下载:https://archive.apache.org/dist/hadoop/common/hadoop-2.7.5/,官方反正我用不了,那个选择版本的按钮点不了。。。。

Spark资源下载:,Spark和Hadoop注意版本对应关系哈,或者你就下我这两个,这俩是配套的;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzfsz.html