scala sdk(spark-scala 无法序列化)
本文目录
- spark-scala 无法序列化
- 如何选择jdk版本,开发java版本的sdk
- IDEA中创建Scala项目没有Scala SDK
- 学习scala有哪些好的资源
- 如何在mac intellij上写scala程序
- eclipse4.4对应的scala版本插件是多少
- eclipse中的scala插件怎么安装
spark-scala 无法序列化
出现错误的原因是,partiti***之间进行shuffle,数据要进行序列化以及反序列化,所以gc容易占用很久时间。
建议使用kryo
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
很省空间,效率比默认的java 序列化要好。
如何选择jdk版本,开发java版本的sdk
对于很多刚接触java语言的初学者来说,要了解一门语言,最好的方式就是要能从基础的版本进行了解,升级的过程,以及升级的新特性,这样才能循序渐进的学好一门语言,版本本别为JDK1.5版本到JDK1.7版本。SDK是Software Development Kit的缩写,中文意思是“软件开发工具包”。这是一个覆盖面相当广泛的名词,可以这么说:辅助开发某一类软件的相关文档、范例和工具的集合都可以叫做“SDK”。SDK是一系列文件的组合,它为软件的开发提供一个平台(它为软件开发使用各种API提供便利)。
(1)JDK1.5新特性:
1).自动装箱与拆箱:
自动装箱的过程:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中。
自动拆箱的过程:每当需要一个值时,被装箱对象中的值就被自动地提取出来,没必要再去调用intValue()和doubleValue()方法。
自动装箱,只需将该值赋给一个类型包装器引用,java会自动创建一个对象。
自动拆箱,只需将该对象值赋给一个基本类型即可。
java——类的包装器
类型包装器有:Double,Float,Long,Integer,Short,Character和Boolean
2).枚举
把集合里的对象元素一个一个提取出来。枚举类型使代码更具可读性,理解清晰,易于维护。枚举类型是强类型的,从而保证了系统安全性。而以类的静态字段实现的类似替代模型,不具有枚举的简单性和类型安全性。
简单的用法:JavaEnum简单的用法一般用于代表一组常用常量,可用来代表一类相同类型的常量值。
复杂用法:Java为枚举类型提供了一些内置的方法,同事枚举常量还可以有自己的方法。可以很方便的遍历枚举对象。
3).静态导入
通过使用 import static,就可以不用指定 C***tants 类名而直接使用静态成员,包括静态方法。
import xxxx 和 import static xxxx的区别是前者一般导入的是类文件如import java.util.Scanner;后者一般是导入静态的方法,import static java.lang.System.out。
4).可变参数(Varargs)
可变参数的简单语法格式为:
methodName(, dataType...argumentName);
(2)JDK 1.6新特性
有关JDK1.6的新特性reamerit的博客文章已经说的很详细了。
1).Desktop类和SystemTray类
在JDK6中 ,AWT新增加了两个类:Desktop和SystemTray。
前者可以用来打开系统默认浏览器浏览指定的URL,打开系统默认邮件客户端给指定的邮箱发邮件,用默认应用程序打开或文件(比如,用记事本打开以txt为后缀名的文件),用系统默认的打印机打印文档;后者可以用来在系统托盘区创建一个托盘程序.
2).使用JAXB2来实现对象与XML之间的映射
JAXB是Java Architecture for XML Binding的缩写,可以将一个Java对象转变成为XML格式,反之亦然。
我 们把对象与关系数据库之间的映射称为ORM, 其实也可以把对象与XML之间的映射称为OXM(Object XML Mapping). 原来JAXB是Java EE的一部分,在JDK6中,SUN将其放到了Java SE中,这也是SUN的一贯做法。JDK6中自带的这个JAXB版本是2.0, 比起1.0(JSR 31)来,JAXB2(JSR 222)用JDK5的新特性Annotation来标识要作绑定的类和属性等,这就极大简化了开发的工作量。 实 际上,在Java EE 5.0中,EJB和Web Services也通过Annotation来简化开发工作。另外,JAXB2在底层是用StAX(JSR 173)来处理XML文档。除了JAXB之外,我们还可以通过XMLBeans和Castor等来实现同样的功能。
3).理解StAX StAX(JSR 173)是JDK6.0中除了DOM和SAX之外的又一种处理XML文档的API。
StAX 的来历 :在JAXP1.3(JSR 206)有两种处理XML文档的方法:DOM(Document Object Model)和SAX(Simple API for XML).
由 于JDK6.0中的JAXB2(JSR 222)和JAX-WS 2.0(JSR 224)都会用到StAX所以Sun决定把StAX加入到JAXP家族当中来,并将JAXP的版本升级到1.4(JAXP1.4是JAXP1.3的维护版 本). JDK6里面JAXP的版本就是1.4. 。
StAX是The Streaming API for XML的缩写,一种利用拉模式解析(pull-parsing)XML文档的API.StAX通过提供一种基于事件迭代器(Iterator)的API让 程序员去控制xml文档解析过程,程序遍历这个事件迭代器去处理每一个解析事件,解析事件可以看做是程序拉出来的,也就是程序促使解析器产生一个解析事件 然后处理该事件,之后又促使解析器产生下一个解析事件,如此循环直到碰到文档结束符; SAX也是基于事件处理xml文档,但却 是用推模式解析,解析器解析完整个xml文档后,才产生解析事件,然后推给程序去处理这些事件;DOM 采用的方式是将整个xml文档映射到一颗内存树,这样就可以很容易地得到父节点和子结点以及兄弟节点的数据,但如果文档很大,将会严重影响性能。
(3)JDK 1.7 新特性
3. 自定义自动关闭类以下是jdk7 api中的接口,(不过注释太长,删掉了close()方法的一部分注释)(4)投稿:junjie 字体: 类型:转载本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API上的改进,比如流,函数式接口,Map以及全新的日期API
“Java is still not dead—and people are starting to figure that out.”
本教程将用带注释的简单代码来描述新特性,你将看不到大片吓人的文字。
一、接口的默认方法
Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下:
代码如下:
inte***ce Formula {
double calculate(int a);
default double sqrt(int a) {
return Math.sqrt(a);
}
}
Formula接口在拥有calculate方法之外同时还定义了sqrt方法,实现了Formula接口的子类只需要实现一个calculate方法,默认方法sqrt将在子类上可以直接使用。
代码如下:
Formula formula = new Formula() {
@Override
public double calculate(int a) {
return sqrt(a * 100);
}
};
formula.calculate(100); // 100.0
formula.sqrt(16); // 4.0
文中的formula被实现为一个匿名类的实例,该代码非常容易理解,6行代码实现了计算 sqrt(a * 100)。在下一节中,我们将会看到实现单方法接口的更简单的做法。
译者注: 在Java中只有单继承,如果要让一个类赋予新的特性,通常是使用接口来实现,在C++中支持多继承,允许一个子类同时具有多个父类的接口与功能,在其他 语言中,让一个类同时具有其他的可复用代码的方法叫做mixin。新的Java 8 的这个特新在编译器实现的角度上来说更加接近Scala的trait。 在C#中也有名为扩展方法的概念,允许给已存在的类型扩展方法,和Java 8的这个在语义上有差别。
二、Lambda 表达式
首先看看在老版本的Java中是如何排列字符串的:
复制代码 代码如下:
List《String》 names = Arrays.asList("peter", "anna", "mike", "xenia");
Collecti***.sort(names, new Comparator《String》() {
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});
只需要给静态方法 Collecti***.sort 传入一个List对象以及一个比较器来按指定顺序排列。通常做法都是创建一个匿名的比较器对象然后将其传递给sort方法。
在Java 8 中你就没必要使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:
复制代码 代码如下:
Collecti***.sort(names, (String a, String b) -》 {
return b.compareTo(a);
});
看到了吧,代码变得更段且更具有可读性,但是实际上还可以写得更短:
复制代码 代码如下:
Collecti***.sort(names, (String a, String b) -》 b.compareTo(a));
对于函数体只有一行代码的,你可以去掉大括号{}以及return关键字,但是你还可以写得更短点:
复制代码 代码如下:
Collecti***.sort(names, (a, b) -》 b.compareTo(a));
总结:试着看哪个版本更顺手,用的效率,。推荐JDK 1.7 。
IDEA中创建Scala项目没有Scala SDK
在创建scala项目的时候create Scala SDK:
这里选择bin上一级目录,然后点击OK
这样就出现了scala-sdk
学习scala有哪些好的资源
为什么学习函数式编程
在阅读DDD巨著《Patterns, Principles, and Practices of Domain-Driven Design》的过程中,Scott在第5章提到了使用函数式编程语言配合贫血模型去实践DDD的一种思路,这激发了我的无限遐想。
在开发领域,我们已经拥有了许多的抽象方**和大量的实现技术。但我个人认为,这一切归根结底,都是人类思维在开发领域的具体表达方式。而人类在认识和分析所要解决的业务领域问题时,思考的内容不外乎由两个部分组成:『业务流程』与『业务规则』。前者,回答了业务活动中先做什么后做什么的问题;后者,则回答了遇到什么情况时应该怎么做的问题。两者结合后,得到我们需要的业务结果,或者叫作“实现业务目标”。
再想想目前学习和掌握的面向对象的一系列方法,又是如何将上述思维结果映射到中去的呢?我认为是这样的:
对于业务流程,我们将其表达为若干对象之间的合作,比如UML里序列图的对象与消息,进而具化为具体的类及其职责,比如类及其若干业务方法。
对于业务规则,我们将其表达为若干的判断逻辑,比如UML流程图里的判断分支,进而具化为业务方法里的if-else语句,或者再复杂一点,表达为工厂、策略等设计模式的实际运用。
然后,我认为,对于复杂业务规则的梳理,可以象数学归纳法一样进行演绎:假设一个函数y=f(x),给定x的定义域,确定y的值域。特别是在排列组合等方面的一些问题,也经常采用递归的方式来解决。所以,从这个角度讲,函数式编程更贴近人类思维习惯,所以让我自然而然地把目光转向了它。
为什么选择Scala
在选择具体的函数式编程语言时,我首先想到的是它最好是同时能支持面向对象编程的。因为即便LISP作为函数式编程语言的先祖,诞生已长达半个世纪,但单纯的函数式编程语言与面向对象编程语言相比,在抽象领域概念、组合系统模块、实现信息隐蔽等方面存在一定的差距,所以一直没有成为开发的主流。
信息隐蔽原理:在西安电子科大蔡希尧与陈平老师于1993年合作出版的《面向对象技术》一书中是这样描述的:把需求和求解的方法分离;把相关信息——数据结构和算法,集中在一个模块之中,和其他模块隔离,它们不能随便访问这个模块内部的信息。
其次,由于我的语言路线是从Pascal → C → C++ → C#,所以我希望能选择一种风格近似于C、强类型的函数式编程语言。在比较了F#、R、ErLang等几种常见的函数式编程语言之后,我最终选择了Scala。
Scala有何优势
注:以下内容,节选翻译或参考自《Programming in Scala》第1章、第3章,《Programming Scala》第6章,不算完整意义上的个人心得。
函数式编程的优势
纯的函数是没有副作用的。无论何时何地,对于一个函数y=f(x),给定x必定得到y,不会因此产生二义结果。因此无论对于代码测试还是并发,由于给定输入必定得到预期输出,而不受其他因素干扰,所以能有效减少Bu**生。
在函数式编程里,大量使用immutable的值。这意味着函数运算的结果总会创建一个新的实例,避免了通常并发环境下为防止数据共享冲突而采取的保护机制。尽管这需要额外的Copy操作,但Scala针对性地提供了高效的Copy实现,以及延迟计算等弥补机制。
函数是一等公民。函数作为表达式的一部分,可以借由函数之间的嵌套、组合,实现复杂的判断逻辑。
Scala语言本身的优势
Scala是面向对象与函数式编程的混合语言,所以能有效结合二者的优点。
Scala属于Java生态圈,可以在JVM上与Java一起编译运行,所以许多Java的框架、工具都可以直接应用于Scala语言编写的项目。
Scala视一切数据类型皆为对象,且支持闭包、lambda、by-name参数等特性,语法简洁明快。
Scala使用Actor作为并发模型,与Akka框架自然契合。这是一种区别于传统的、基于数据共享、以锁为主要机制的并发模型,其特点在于以Actor为基本单位、没有数据共享、基于消息传递实现Actor之间的协作,因此可以有效避免死锁、减少竞争。
最后,如果有朝一日要转向大数据领域,有Spark这样的大型框架作为支撑。知乎:与 Hadoop 对比,如何看待 Spark 技术?
Scala对实践DDD有何意义
说了那么多,我的根本目的还是要将Scala作为实现DDD的主要武器。那么试想一下,Scala在我们实现DDD的过程中能有哪些帮助呢?我暂且胡侃乱诌如下:
表示值对象、领域事件等元素更直观。值对象、领域事件在DDD里都应该是immutable的,以往多采取POCO形式表示,现在改用Scala里的val以及case class表示,在语法层面就直观地表明是不可修改的。
在类的方法层面实现CQRS时有语法支持。用Scala里的Function(返回类型为非Unit)对应CQRS里uery,保证类的方法没有副作用;用Procedure(返回类型为Unit)对应CQRS里的Command,明确表明这一类方**产生修改状态等副作用。这同样从语法层面就能对二者进行明确区分。
模式匹配丰富了函数操作。除了正则表达式,Scala形式多样的模式匹配语法,为提取数据、完成数据分组聚合等运算、实现逻辑判断提供了强大支持。比如定义def sum_count(ints:Seq[Int) = (ints.sum, ints.size)这样一个函数后,我们可以这样调用,以得到一个1至6的整数序列的整数值合计,及该序列的尺寸:val(sum, count) = sum_count(List(1, 2, 3, 4, 5, 6))。
为实现DSL提供有力支持。Scala自带有解析框架,加上灵活的函数语法支持,要自己实现一套DSL及其相应的语法解析器将不再困难。比如在配置文件里这样的一条配置语句,表示退休条件为年龄达到60周岁或者工龄届满30年:retire = (Age 》= 60) || (ServiceLength 》= 30)。以往的方式是自己写一个语法解析器,把这条文本转换成相应的Specification对象,然后扔给聚合去使用。现在有了Scala的帮助,就使编写语法解析器这一环节的工作量大大减少。
合理的高阶函数设计,使规则编写得到简化。比如规则、费用报销规则,以往可能需要若干层的if-else嵌套,现在则将通过高阶函数得到大幅简化。对此,我强烈刘光聪先生的Refactoring to Functi***,你会在刘先生的重构过程中发现高阶函数的强大。
Actor为高效并发打下基础。Actor
内部完全自治,自带用于存储消息的mailbox,与其他Actor只能通过消息进行交互,每个Actor都是并发的一个基本单位。这些特点,非常适合于
采取Event
Sourcing方式实现的DDD。每个聚合都好比一个Actor,在聚合内部始终保持数据的强一致性,而在聚合之间交互的领域事件则好比Actor之间
的消息,聚合之间借由领域事件和Saga保证数据的最终一致性。
Trait成为AOP利器。Trait是Scala的另一大特色,它就象AOP织入一样,能动态地给某个类型注入方法或者结构。比如配合类Circuit和with后面那4个Trait的定义,val circuit = new Circuit with Adders with Multiplexers with Flipflops with MultiCoreProcessors这样就创建了一个带有加法器、乘法器、触发器和多核处理器的元件。
隐式实现为类型扩展提供支持。对应C#里的静态扩展方法,Scala通过implicit为实现数据类型的方法扩展提供了便捷,成为Trait之外的另一个功能扩展手段。
能降低常见BDD框架的学习成本。尽管这一点可能比较牵强,但我正在努力摸索如何将BDD与DDD结合,而常见的Cucumber、Spock等一些BDD框架,其语法与Scala比较相近,所以我才有如此一说。
有哪些Scala学习资料
以下是我目前主要的学习资料,并衷心欢迎各位留言补充。
书籍
Programming in Scala:由Scala语言的设计师Martin Odersky编写,循序渐进,配合了大量实例,入门必读吧。
Programming Scala:视角与上面那本有点不一样,没有Scala语言基础会感觉很困难,适合掌握了基本语法后温故而知新。
在线文档与
Scala 官方文档:Scala的,作为寻找资料的出发点是不错的。
Scala 课堂:中文版的Scala基本语法在线课堂。
Scala Synatax Primer:由Jim McBeath整理的Scala语法概要,可以当字典用。
The Neophyte’s Guide to Scala:很出名的一个Scala入门指南,以Scala中的提取器Extractor作为实例开始。
Scala 初学指南:这是上面那本指南的中译本。
Effective Scala:中文版的Scala高效编程
SBT中文入门指南:Scala Build Tool
社区
Scala 中文社区:不算活跃,原因你懂的。
Scala User:Scala入门者聚集地,没有Stack Overflow那么严格,但也需要点爬墙的身手。
SDK及IDE
Java SE:先装这个
Scala SDK:再装这个
SBT:然后装这个
IntelliJ IDEA:最后装这个,就能比较方便地开始Scala编程了
写在最后
最
近读的书很多也很杂,DDD、BDD、Scala、Cucumber以及Java基础等等都有涉及,真恨不得一口吃成个大胖子。由于时间和精力有限,所以
现在知识消化很成问题,迟迟没有进入学以致用的环节,只能先这样纸上谈兵了,好歹先把自己在学习过程中的一些思考、看到的好东西先记载下来,以备将来之
需。
如何在mac intellij上写scala程序
久闻Scala大名,一直没有契机去学习,趁现在有个机会,去体验一下scala的美妙,在选择IDE的时候,看到有人推荐IntelliJ,以前开发Android的时候,使用过基于IntelliJ的android Studio,感觉良好,所以在Scala学习中,也选择IntelliJ作为开发工具。
配置Java和Scala环境
Java 配置
Mac自带Java,在Terminal中 输入
java -version
输出
Java version “1.7.0_79”
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
出现类似信息,说明你的Java环境已配置好。
Scala 配置
手动配置
官网下载地址,选择好版本
然后在网页下方
选择要下载的安装包,下载完成后,移动到你的安装目录,然后解压
我是放到了/usr/local/share/下
mv scala-xxx.tgz /usr/local/share/
然后配置环境变量,在Terminal中 vim ~/.bash_profile,在里面加入
SCALA_HOME=/usr/local/share/scala
export PATH=$PATH:$SCALA_HOME/bin
保存退出,然后在Terminal中
source ~/.bash_profile
使配置文件生效。
在Terminal中,输入
scala version
查看信息,即表示安装成功
自动安装
在Terminal中,使用
brew install scala
这样安装的是最新版本(如果你没有安装 homebrew,请安装好以后,再重试)
如果需要安装以前老版本,比如 Scala 2.10.4 (old version)
brew install homebrew/versi***/scala210
安装成功后,在Terminal中,输入
scala version
查看信息,即表示安装成功。
IntelliJ的下载和配置
下载
官网下载地址
如果简单学习,使用社区版即可,如果专业开发,请购买专业版。如果资金充裕,建议购买专业版,不想花钱的话,网上也有很多破解方法,自行查找。
配置
下载完成后,打开IntelliJ,在菜单栏的Preference中,选择Plugins(插件),然后搜索Scala
安装即可,如果安装速度较慢,也可选择下方的Install plugin from disk
自己手动下载好插件进行安装
Hello World
安装好插件,重启IntelliJ,我们就可以开始第一写自己的第一行Scala代码了
选择 Create New Project
点击下一步,为你的项目起一个名字
点击Finish 即可
问题
注意上图中红框部分,看看SDK是否为空,如果为空,选择Create
通过 Download 新下载一个SDK,或者Browse 找到自己在第一步中自己安装Scala的路径,配置好即可。
下面就可以开始你的第一行Hello world了。
eclipse4.4对应的scala版本插件是多少
获取
首先进入scala-ide 主页,了解最新情形。注意scala-ide并不是一个独立的ide,它只是eclipse的一个插件。
***隐藏网址***
安装
在eclipse中,选择“Help-》Install New SoftWare”,填上获得的下载链接,选择前两项,安装后重启即可。
上述链接是scala-ide的4.2.0版,包含的内容有:
Scala 2.11.7 and Scala 2.10.5
Sbt 0.13.8
Scalariform 0.1.6
Scala Refactoring 0.7.0
使用
装好之后,新建Scala工程,会自动导入Scala Library(2.11.7)和 JRE System Library。不过,为在本地运行,还需导入Spark的jar包–spark-1.4.1-bin-hadoop2.6/lib/spark-assembly-1.4.1-hadoop2.6.0.jar,该包在Spark目录下的lib文件夹里。
问题汇总
问题1:安装插件后,打开eclpse,显示jdt未激活
此问题是由于下载的插件版本与eclipse不匹配造成的,卸载重装。
问题2:
More than one scala library found in the build path (/home/asin/.eclipse/org.eclipse.platform_4.4.2_1786068630_linux_gtk_x86_64/plugins/org.scala-lang.scala-library_2.11.7.v20150622-112736-1fbce4612c.jar, /home/asin/SoftWare/spark-1.4.1-bin-hadoop2.6/lib/spark-assembly-1.4.1-hadoop2.6.0.jar).At least one has an incompatible version. Please update the project build path so it contains only one compatible scala library. test Unknown Scala Classpath Problem1
该问题是指由于导入的scala包和spark包不兼容,导致部分包重复。此时,往往是因为scala的版本过高的问题,右击工程,选择Scala-》Set the Scala Installation,选择2.10.5即可。
另外,给出我的环境配置,供大家参考。
eclipse中的scala插件怎么安装
(1)安装scala
***隐藏网址***
***隐藏网址***
建议下载msi,比较方便。
下载之后直接安装即可。
记住安装目录,比如本人安装在 D:\proSoftware\scala
修改环境变量
不同版本的windows界面不尽相同,进入环境变量之后,修改系统变量中的path变量,在最后加入
D:\proSoftware\scala\bin 注意,如果加入之前最后没有分号,记得手动加上分号,同时记得在scala目录之后加上\bin
修改完环境变量之后,运行cmd 输入 scala -version 出现版本信息表示安装成功。
(2)安装eclipse的scala插件
***隐藏网址***
下载完直接解压就可以运行,打开解压好的eclipse
点击file-》new -》scala project
填写project name
右击文件夹,new--》scala object
填写名称 hello
然后增加代码
def main(args :Array){
println("Hello world!");
}
选中Hello.scala,右击run as -》scala application
控制台输出结果
成功。
更多文章:
help out(help out和help out with的区别)
2026年4月13日 07:40
find函数什么意思(find(“”,A3&“”)函数是什么意思)
2026年4月13日 06:40
学了c语言还要学python吗(c语言和python先学哪个比较简单)
2026年4月13日 05:40
memcached未授权访问漏洞怎么解决(Memcached 如何设置比较好Linux 服务器中宝塔面板)
2026年4月13日 05:20






