0
点赞
收藏
分享

微信扫一扫

【Spark】scala基础操作(持续更新)


文章目录

  • ​​零、IDEA的scala环境配置​​
  • ​​0.1 spark和scala之间的关系​​
  • ​​0.2 编写项目​​
  • ​​(1)配置pom.xml文件:​​
  • ​​(2)配置对应环境​​
  • ​​(3)测试代码​​
  • ​​(4)控制台出去日志信息​​
  • ​​一、scala特点​​
  • ​​1.1 面向对象特性​​
  • ​​1.2 函数式编程​​
  • ​​1.3 静态类型​​
  • ​​二、代码简单测试栗子​​
  • ​​三、scala trait(特征)​​
  • ​​四、case class和class区别​​
  • ​​五、常见问题​​
  • ​​5.1 IDEA安装完插件Scala后 通过add frameworks support找到不到scala插件​​
  • ​​5.2 快速导入头文件​​
  • ​​5.3 Intellij compile failures: "is already defined as"​​
  • ​​Reference​​

零、IDEA的scala环境配置

安装scala 插件
打开菜单 [File] → [Settings] → [Plugins],搜索scala,点击[install]

给项目添加scala模块
右键 [项目] → [Add Frameworks Support] → [Scala] → [Create],选择scala的sdk

在源文件目录创建scala目录
右键 [src源目录] → [New] → [Directory],新建scala目录

将scala目录转换成源目录
右键 [scala目录] → [Mark Directory as] → [Sources Root]

0.1 spark和scala之间的关系

  • Spark 和Hadoop 的根本差异是多个作业之间的数据通信问题 : Spark 多个作业之间数据通信是基于内存,而 Hadoop 是基于磁盘。
  • Spark本身就是使用Scala语言开发的,spark和flink的底层通讯都是基于的高并发架构akka开发,然而akka是用scala开发的,Scala与Spark可以实现无缝结合,因此Scala顺理成章地成为了开发Spark应用的首选语言

0.2 编写项目

(1)配置pom.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.example</groupId>
<artifactId>spark-demo</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.4.4</version>
</dependency>

<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.11</artifactId>
<version>2.4.4</version>
</dependency>

</dependencies>

</project>

(2)配置对应环境

在刚才创建项目时已经有加入java的JDK了(注意JDK的版本):

【Spark】scala基础操作(持续更新)_函数式编程

可以在project structure中查看global libraries选择scala SDK:

【Spark】scala基础操作(持续更新)_scala_02

(3)测试代码

【Spark】scala基础操作(持续更新)_spark_03

这里展示一个经典的统计词频代码:

package com.spark

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object Demo_0703 {
def main(args: Array[String]): Unit = {
val sc = new SparkContext(new SparkConf().setMaster("local[*]").setAppName("wc"))

val rdd: RDD[String] = sc.makeRDD(List(
"spark hello", "hive", "hadoop hbase", "spark hadoop", "hbase"
))

// reduceBykey
def wordCount1(rdd: RDD[String]): Unit = {

// 扁平化操作,拆分出数据
val value: RDD[String] = rdd.flatMap(_.split(" "))
// map转换为(key,1)
val mapRDD: RDD[(String, Int)] = value.map((_, 1))
// reduceByKey根据key进行聚合
val result: RDD[(String, Int)] = mapRDD.reduceByKey(_ + _)

result.collect().foreach(println)
}
wordCount1(rdd)

sc.stop()
}
}

(4)控制台出去日志信息

为了在(3)运行后控制台不出现这么多红色的​​INFO​​​日志信息,可以在项目中的​​resources​​​目录中创建​​log4j.properties​​,添加日志配置信息:

log4j.rootCategory=ERROR, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n

# Set the default spark-shell log level to ERROR. When running the spark-shell, the
# log level for this class is used to overwrite the root logger's log level, so that
# the user can have different defaults for the shell and regular Spark apps.
log4j.logger.org.apache.spark.repl.Main=ERROR

# Settings to quiet third party logs that are too verbose
log4j.logger.org.spark_project.jetty=ERROR
log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=ERROR
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=ERROR
log4j.logger.org.apache.parquet=ERROR
log4j.logger.parquet=ERROR

# SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support
log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR

一、scala特点

Spark支持使用Scala、Java、Python和R语言进行编程。由于Spark采用Scala语言进行开发,因此,建议采用Scala语言进行Spark应用程序的编写。Scala是一门现代的多范式编程语言,平滑地集成了面向对象和函数式语言的特性,旨在以简练、优雅的方式来表达常用编程模式。Scala语言的名称来自于“可伸展的语言”,从写个小脚本到建立个大系统的编程任务均可胜任。Scala运行于Java平台(JVM,Java 虚拟机)上,并兼容现有的Java程序。

1.1 面向对象特性

Scala是一种纯面向对象的语言,每个值都是对象。对象的数据类型以及行为由类和特质描述。
类抽象机制的扩展有两种途径(能避免多重继承的种种问题):一种途径是子类继承,另一种途径是灵活的混入机制。

1.2 函数式编程

Scala也是一种函数式语言,其函数也能当成值来使用。Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化。Scala的case class及其内置的模式匹配相当于函数式编程语言中常用的代数类型。

可以利用Scala的模式匹配,编写类似正则表达式的代码处理XML数据。

1.3 静态类型

Scala具备类型系统,通过编译时检查,保证代码的安全性和一致性。类型系统具体支持以下特性:

  • 泛型类
  • 协变和逆变
  • 标注
  • 类型参数的上下限约束
  • 把类别和抽象类型作为对象成员
  • 复合类型
  • 引用自己时显式指定类型视图
  • 多态方法

二、代码简单测试栗子

右键 [scala目录] → [New] → [Scala Class],新建文件xxx.scala:

/**
* object 单例对象中不可以传参,
* 如果在创建Object时传入参数,那么会自动根据参数的个数去Object中寻找相应的apply方法
*/
object Lesson_ObjectWithParam {
// object相当于java的工具类
def apply(s:String) = {
println("name is "+s)
}
def apply(s:String,age:Int) = {
println("name is "+s+",age = "+age)
}
def main(args: Array[String]): Unit = {
Lesson_ObjectWithParam("zhangsang")
Lesson_ObjectWithParam("lisi",18)
}
}
//name is zhangsang
//name is lisi,age = 18

三、scala trait(特征)

  • ​trait​​​类似java的接口,但是和接口不同的是,​​trait​​还能定义属性和方法的实现。
  • 一般情况下Scala的类只能够继承单一父类,如果是trait就可以实现多重继承。
  • 下面的栗子是trait特征由​​isEqual​​​和​​isNotEqual​​方法组成(前者没有定义具体的方法实现,后者有),类似java的抽象类。

trait Equal {
def isEqual(x: Any): Boolean
def isNotEqual(x: Any): Boolean = !isEqual(x)
}

class Point(xc: Int, yc: Int) extends Equal {
var x: Int = xc
var y: Int = yc
def isEqual(obj: Any) =
obj.isInstanceOf[Point] &&
obj.asInstanceOf[Point].x == x
}

object Test {
def main(args: Array[String]) {
val p1 = new Point(2, 3)
val p2 = new Point(2, 4)
val p3 = new Point(3, 3)

println(p1.isNotEqual(p2))
println(p1.isNotEqual(p3))
println(p1.isNotEqual(2))
}
}
/* false true true */

更多:​​Scala中trait相关知识和应用​​

四、case class和class区别

  • 1、初始化的时候可以不用new,当然也可以加上,普通类一定需要加new
  • 默认实现了equals 和hashCode
  • 默认是可以序列化的,也就是实现了Serializable
  • 自动从scala.Product中继承一些函数
  • case class构造函数的参数是public级别的,我们可以直接访问
  • 支持模式匹配

五、常见问题

5.1 IDEA安装完插件Scala后 通过add frameworks support找到不到scala插件

​​IDEA安装完插件Scala后 通过add frameworks support找到不到scala插件​​,不过可能也解决不了。

5.2 快速导入头文件

光标移动到需要添加头文件的代码部分,按Alt + enter。

5.3 Intellij compile failures: “is already defined as”

可以参考​​Stack Overflow​​的问答。

Reference

[1] https://docs.scala-lang.org/getting-started/index.html
[2] ​​​scala基础教程​​​ [3] https://www.runoob.com/scala/scala-traits.html
[4] ​​Spark-Mac上IDEA配置Spark开发环境​​ [5] ​​Idea配置和运行scala​​ [6] ​​IDEA配置JDK的几种方式​​ [7] ​​scala——关键字trait的使用​​ [8] ​​厦大大数据之Spark入门教程(Scala版)​​ [9] ​​spark编程00——IDEA创建spark项目​​ [10] ​​jdk版本的选择(推荐1.8)​​ [11] ​​某硅谷spark大数据教学课程​​ [12] ​​class与case class的区别​​ [13] ​​使用集群模式运行Spark程序​​ [14] scala官方文档:https://docs.scala-lang.org/overviews/scala-book/traits-interfaces.html#extending-a-trait


举报

相关推荐

0 条评论