scala add elements 集合添加元素

scala add elements to List or Set,集合添加元素是scala预约经常遇到的操作。。笔者只对该两个集合的基本操作做入门级实验,具体应用中的细节不做过多的说明,请读者自行多多验证,多动手才能卷到往生。

默认情况下,scala 的List 和 Set 都是不变的,如果新增元素或者拼接新的集合其实都是生成了新的实例

List集合添加元素的一些操作

    val list1 =List(4,5,6,7,8)
    println(s"list1 = ${list1}")
    // 增加元素
    val list2 = 1::list1.::(9)
    println(s" :: 主动调用和被动添加 都放在集合前; list2 = ${list2}")
    val list3 = 10+:list1 :+ 11
    println(s"+: :+ 添加到集合前 集合后; list3 = ${list3}")
    // list 集合拼接
    val  list4 = list2 ++ list3
    println(s"两个集合拼接成新的集合; list4 = ${list4}")
    // list集合与list集合的元素拼接
    val list5 = list1 ::: list3
    println(s"list1 ::: list3 = ${list5}")
    val shuzu = Array(1, 3, 4) ++ Array(55,33 ,55)
    println(s"::: 只能用在List , 而++还可以用在 Array 数组: ${ shuzu.mkString(",") }")
list1 = List(4, 5, 6, 7, 8)
 :: 主动调用和被动添加 都放在集合前; list2 = List(1, 9, 4, 5, 6, 7, 8)
+: :+ 添加到集合前 集合后; list3 = List(10, 4, 5, 6, 7, 8, 11)
两个集合拼接成新的集合; list4 = List(1, 9, 4, 5, 6, 7, 8, 10, 4, 5, 6, 7, 8, 11)
list1 ::: list3 = List(4, 5, 6, 7, 8, 10, 4, 5, 6, 7, 8, 11)
::: 只能用在List , 而++还可以用在 Array 数组: 1,3,4,55,33,55

我们在以前的文章中有学习到Array的一些入门操作。读者可以移步自赏

Set集合添加元素的操作

scala set
默认set是不可变的
上图的输出结果
Set()
Set(5)

在上图中我们可以看到set1默认是空集合,它不可以添加元素;可能会有人对+号操作有误解, + 号操作返回的是一个新集合,并不是对set1的修改。而且我们定义set1用的是关键字val 那么set1对象实例本身就是不可以修改的。

    import scala.collection.mutable.Set
    val set1 = Set[Int]()
    set1.add(4)
    set1.add(4)
    set1 += 3
    set1.add(5)
    println(s"before add 6 , set1 = ${set1}")
    set1.add(6)
    println(s"after add 6 , set1 = ${set1}")
    set1.remove(4)
    println(s"after remove 4 , set1 = ${set1}")
    set1 ++= Vector(7, 8)
    println(s"after ++=Vector , set1 = ${set1}")
before add 6 , set1 = Set(5, 3, 4)
after add 6 , set1 = Set(5, 6, 3, 4)
after remove 4 , set1 = Set(5, 6, 3)
after ++=Vector , set1 = Set(5, 6, 3, 7, 8)

Priority Queue Serialization Error 在spark中引入LinkedInAttic scanns 运行时报错

Priority Queue Serialization Error ,在spark中引入第三方linkedInAttic的scanns jar包,在运行时报Queue Serialization Error,笔者使用gradle做的项目编辑工具,具体的jar包引入可以参考上一篇文章

scala version --  compile 'org.scala-lang:scala-library:2.11.8'
spark ml version -- compileOnly 'org.apache.spark:spark-mllib_2.11:2.3.0'

1、错误提示

org.apache.spark.SparkException: Job aborted due to stage failure: Task 946.0 in stage 16.0 (TID 1971) had a not serializable result: scala.collection.mutable.PriorityQueue$$anon$3
Serialization stack:
- object not serializable (class: scala.collection.mutable.PriorityQueue$$anon$3, value: non-empty iterator)

2、项目依然打开的issues:

LInkedInAttic 其实是linked公司已经不再维护更新的项目,但是很多项目在特定的应用场景下有其独有的价值的,可以说是一个宝库。

https://github.com/LinkedInAttic/scanns/issues/3

3、解决方案

目前笔者验证过的可行解决方案有两个

1、升级scala和spark版本, 在open的issues最后边有对应的提示(如下图)
2、修改scanns源码,从新编译jar包

升级scala和spark版本

修改源码的方案涉及到的文件主要就一个scala文件scanns/src/main/scala/com/linkedin/nn/model/LSHNearestNeighborSearchModel.scala

修改scala源码
修改scala源码2

gradle dependencies location 添加 maven本地仓库的jar包

gradle dependencies location : gradle编译项目时需要引入对应的依赖包,一般情况下,直接按照正常的格式填写dependencies就可以通过maven远程仓库拉取所需的jar包, 但是凡事总是有特殊存在的。

有些第三方的jar可能没法通过maven远程仓库拉取下来又或者coder对一些源码做了个性化修改而需要自行编译jar来满足自己的需求等。这个时候需要coder把自己修改并编译的jar包添加到maven的本地仓库,在gradle的依赖repositories设置时优先在本地仓库查找jar包。

引入maven本地仓库的jar包

一下的例子就是在用spark处理文本信息并做相似处理时的一个第三方jar的引入,该jar自行编译后手动添加到本地的maven库中。

repositories {
    //由于国内可能无法正常访问maven中心库,这里就填写了两个基本上能正常访问的maven库地址
    mavenLocal()
    maven {
        url 'http://maven.aliyun.com/nexus/content/groups/public/'
    }
    maven {
        url 'https://repo.maven.apache.org/maven2/'
    }
    mavenCentral()
}
dependencies {
    compile 'org.scala-lang:scala-library:2.11.8'
// scanns添加到了本地仓库
    compileOnly 'com.linkedin.nn:scanns_2.11:2.11'
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

jar包添加到maven本地仓库

mvn install:install-file -Dfile=D:\scanns_2.11-1.0.0.jar -DgroupId=com.linkedin.nn -DartifactId=scanns_2.11 -Dversion=2.11 -Dpackaging=jar
-- DgroupId和DartifactId构成了该jar包在pom.xml的坐标, 对应依赖的DgroupId和DartifactId
-- Dfile表示需要上传的jar包的绝对路径
-- Durl私服上仓库的url精确地址(打开nexus左侧repositories菜单,可以看到该路径)
-- DrepositoryId服务器的表示id,在nexus的configuration可以看到