文章目录
1. 依赖jar包的查找地址 Maven Repository仓库
2. scala中的项目管理工具sbt
sbt是类似ANT、MAVEN的构建工具,全称为Simple build tool,是Scala事实上的标准构建工具
2.1.软件安装和配置
-
通过sbt管理项目,要在build.properties中的版本改成与本地安装一直,不然会用idea自己捆绑的
-
windows下安装配置sbt (
重要
)-
安装软件到位置:D:\dev\sbt
-
sbt安装目录下的conf目录中添加了一个repo.properties文件
[repositories] local maven-local:file://D:/apache-maven-3.5.4/local_repository nexus-aliyun: https://maven.aliyun.com/nexus/content/groups/public/ nexus-aliyun-apache: https://maven.aliyun.com/nexus/content/repositories/apache-snapshots/ mapr-public: https://maven.aliyun.com/repository/mapr-public/ typesafe: https://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly huaweicloud-maven: https://repo.huaweicloud.com/repository/maven/ sbt-plugin-repo: https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
-
sbtconfig.txt配置
-Dsbt.ivy.home=d:/sbt/.ivy2 -Dsbt.global.base=d:/sbt/.sbt -Dsbt.repository.config=d:/sbt/conf/repo.properties -Dsbt.boot.directory=d:/sbt/.sbt/boot/ -Dsbt.override.build.repos=true
-
IDEA当中的配置
-
-
注意1:第一次输入sbt的时候需要准备一些东西,所以下载比较慢,主要下载内容已经放到了我的百度云盘:windows10平台,.ivy2和.sbt默认在c盘用的家目录下面,建议配置到自己的安装目录下面,方便管理
注意2:遇到了一个错误There may be incompatibilities among your library dependencies; run 'evicted
- 解决: 需要把C:\Users\59404\AppData\Local\Temp目录下的内容清理一下,由于安装了多个版本导致。
- .ivy2和.sbt百度云链接;提取码 dxoj
2.2. sbt官网案例
3. sbt进阶
3.1. 操作符
:=
是给key分配一个初始表达式,覆盖原来的任何配置+=
是追加一个值到key++=
是追加一个队列,队列中放值,将值追加到key
3.2. task,里面可以定义task,task可以是执行外部的命令
-
案例一
// 定义了task的类型为Unit,Key值叫helloTask val helloTask = taskKey[Unit]("say hello") helloTask := { print("hello task!") }
-
案例二(
task之间没有依赖关系
)val helloTask = taskKey[String]("say hello") val hiTask = taskKey[String]("say hi") val byeTask = taskKey[String]("say bye") val runAllTask = taskKey[Unit]("run all") runAllTask := { println(helloTask.value) println(hiTask.value) println(byeTask.value) } helloTask := { val hello = "hello" println(s"hello task run: $hello") Thread sleep 2000 hello } hiTask := { val hi = "hi" println(s"hi task run: $hi") Thread sleep 2000 hi } byeTask := { val bye = "bye" println(s"bye task run: $bye") Thread sleep 2000 bye }
-
案例三(
有依赖关系
)val helloTask = taskKey[String]("say hello") val hiTask = taskKey[String]("say hi") val byeTask = taskKey[String]("say bye") val runAllTask = taskKey[Unit]("run all") runAllTask := { println(helloTask.value) println(hiTask.value) println(byeTask.value) } helloTask := { val hello = "hello" println(s"hello task run: $hello") Thread sleep 2000 hello } hiTask := { val hi = "hi" println(s"hi task run: $hi") Thread sleep 2000 hi } byeTask := { val hi = hiTask.value val bye = "bye" println(s"hi task run: $hi") println(s"bye task run: $bye") Thread sleep 2000 bye }
-
结论
在没有依赖关系的时候是并行,但有依赖关系就是串行,如果我们再设置hi依赖hello,那么就是6s
如果互相依赖可能造成死锁,比如a依赖b的value,b里面又依赖a的value,那么就是鸡生蛋和蛋生鸡的问题了
3.3. 待完善
4. spark之rdd小案例(sbt构建
)
4.1. PV计算
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object PV {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("pv").setMaster("local[2]")
val sc = new SparkContext(conf)
val result: RDD[(String, Int)] = sc.textFile("D:\\access.log").map(x => ("pv", 1)).reduceByKey(_ + _)
result.foreach(println)
}
}
4.2. UV计算
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object UV {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("pv").setMaster("local[2]")
val sc = new SparkContext(conf)
val result: RDD[(String, Int)] = sc.textFile("D:\\access.log").map(_.split(" ")).map(x => x(0)).distinct().map(x => ("uv", 1)).reduceByKey(_+_)
result.foreach(println)
}
}
4.3. TOPN
- 数据格式
import org.apache.spark.{SparkConf, SparkContext}
object TopN {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("pv").setMaster("local[2]")
val sc = new SparkContext(conf)
val result: Array[(String, Int)] = sc.textFile("access.log").map(_.split(" ")).map(x => x(10)).map((_, 1)).reduceByKey(_ + _).sortBy(_._2, false).take(3)
println(result)
}
}