2021-10-20 Scala Basics

Apache Spark with Scala-Hands on with big data

scala是funcional language

prep

image.png

intelliJ import项目的时候报错:scala compiler not enough space
增加环境变量 _JAVA_OPTIONS: -Xmx512M
会报错 picked up 。。。但可以正常跑完

新建 scala worksheet

scala 基本语法

  • values不可更改 val hello: String = "Hello"
  • varables 可更改
  • 类型:Int Boolean Char Double Float Long Byte

print

println()

println(f"is $a%.3f")
类似prinf,formating print;$表示一个变量;%部分为格式设定
%05d 补齐5位

println(s"is $a")
插入变量
${1+2} expression计算

正则表达式

   val theUltimateAnswer: String = "To life, the universe, and everything is 42."
   val pattern = """.* ([\d]+).*""".r
   val pattern(answerString) = theUltimateAnswer
   val answer = answerString.toInt
   println(answer)
   // VALUES are immutable constants.
   val hello: String = "Hola!"

   // VARIABLES are mutable
   var helloThere: String = hello
   helloThere = hello + " There!"
   println(helloThere)

   val immutableHelloThere = hello + " There"
   println(immutableHelloThere)

   // Data Types

   val numberOne: Int = 1
   val truth: Boolean = true
   val letterA: Char = 'a'
   val pi: Double = 3.14159265
   val piSinglePrecision: Float = 3.14159265f
   val bigNumber: Long = 123456789
   val smallNumber: Byte = 127

   println("Here is a mess: " + numberOne + truth + letterA + pi + bigNumber)

   println(f"Pi is about $piSinglePrecision%.3f")
   println(f"Zero padding on the left: $numberOne%05d")

   println(s"I can use the s prefix to use variables like $numberOne $truth $letterA")

   println(s"The s prefix isn't limited to variables; I can include any expression. Like ${1+2}")



   // Booleans
   val isGreater = 1 > 2
   val isLesser = 1 < 2
   val impossible = isGreater & isLesser
   val anotherWay = isGreater || isLesser

   val picard: String = "Picard"
   val bestCaptain: String = "Picard"
   val isBest: Boolean = picard == bestCaptain

Control Flow

// Flow control

// If / else:
if (1 > 3) println("Impossible!") else println("The world makes sense.")

if (1 > 3) {
  println("Impossible!")
  println("Really?")
} else {
  println("The world makes sense.")
  println("still.")
}

// Matching
val number = 2
number match {
  case 1 => println("One")
  case 2 => println("Two")
  case 3 => println("Three")
  case _ => println("Something else")
}

for (x <- 1 to 4) {
  val squared = x * x
  println(squared)
}

var x = 10
while (x >= 0) {
  println(x)
  x -= 1
}

x = 0
do { println(x); x+=1 } while (x <= 10)

// Expressions

{val x = 10; x + 20}

println({val x = 10; x + 20})

expression

{val x = 10; x + 20} 返回表达式最后的值

Functions

不要忘记等号
不需要return,最后一个表达式的值会被默认返回

def squareIt(x: Int) : Int = {
  x * x
}

函数可以将函数作为参数

def transformInt(x: Int, f: Int => Int): Int = {
  f(x)
}

将函数名称作为参数传给y
或者放一个匿名函数

transformInt(2, cubeIt)

transformInt(3, x => x * x * x)

完整代码

// Functions

// format def <function name>(parameter name: type...) : return type = { }

def squareIt(x: Int) : Int = {
  x * x
}

def cubeIt(x : Int) : Int = {x * x * x}

println(squareIt(2))

println(cubeIt(3))

def transformInt(x: Int, f: Int => Int): Int = {
  f(x)
}

val result = transformInt(2, cubeIt)
println(result)

// 匿名函数
transformInt(3, x => x * x * x)

transformInt(10, x => x / 2)

transformInt(2, x => {val y = x * 2; y * y}) //多行匿名函数

data structure

tuples

可以不同类型
1-based

// Tuples
// Immutable lists

val captainStuff = ("Picard", "Enterprise-D", "NCC-1701-D")
println(captainStuff)

// Refer to the individual fields with a ONE-BASED index
println(captainStuff._1)
println(captainStuff._2)
println(captainStuff._3)

val picardsShip = "Picard" -> "Enterprise-D"
println(picardsShip._2)

val aBunchOfStuff = ("Kirk", 1964, true)

lists

必须同一类型
0-based
head :第一个元素
tail:除去第一个的剩下的元素
map:将函数应用于list所有元素
reduce:当前输出给x,新元素给y。
合并list: ++

// Lists
// Like a tuple, but more functionality
// Must be of same type

val shipList = List("Enterprise", "Defiant", "Voyager", "Deep Space Nine")

println(shipList(1))
// zero-based

println(shipList.head)
println(shipList.tail)

for (ship <- shipList) {println(ship)}

val backwardShips = shipList.map( (ship: String) => {ship.reverse})
for (ship <- backwardShips) {println(ship)}

// reduce() to combine together all the items in a collection using some function
val numberList = List(1, 2, 3, 4,5 )
val sum = numberList.reduce( (x: Int, y: Int) => x + y)
println(sum)

// filter() removes stuff
val iHateFives = numberList.filter( (x: Int) => x != 5)

val iHateThrees = numberList.filter(_ != 3)

// Concatenate lists
val moreNumbers = List(6,7,8)
val lotsOfNumbers = numberList ++ moreNumbers

val reversed = numberList.reverse
val sorted = reversed.sorted
val lotsOfDuplicates = numberList ++ numberList
val distinctValues = lotsOfDuplicates.distinct
val maxValue = numberList.max
val total = numberList.sum
val hasThree = iHateThrees.contains(3)

Maps

类似字典

// MAPS
val shipMap = Map("Kirk" -> "Enterprise", "Picard" -> "Enterprise-D", "Sisko" -> "Deep Space Nine", "Janeway" -> "Voyager")
println(shipMap("Janeway"))
println(shipMap.contains("Archer"))
val archersShip = util.Try(shipMap("Archer")) getOrElse "Unknown"
println(archersShip)

RDD

RDD: Resilient Distributed Dataset
rows


如何创建RDD

transforming RDDs

  • map
  • flatmap:one row of RDD -> multiple rows of RDDs
  • filter
  • distinct
  • sample
  • union, intersection, substract, cartesian
    RDD actions
  • collect
  • count
  • countByValue
  • take
  • top
  • reduce

Key/Value RDD

totalsByAge = rdd.map( x => (x,1))

  • reduceByKey() rdd.reduceByKey((x+y) => x+y) 将同一个key的所有values相加。x可认为是当前running total,y是新的一个value
  • groupByKey()
  • sortByKey
    -keys() values() :创建一个RDD,只有keys 或者values
  • join,rightOuterJoin, leftOuterJoin,cogroup,subtractByKey
  • mapValues :只针对value应用函数

代码解读
rdd的每行是一个tuple (age,numFriends)

  • mapValues :values从numFriends,变为 (numFriends,1)
  • reduceByKey:x和y都是tuples,前者是部分计算的结果,后者是新的未计算的一个tuple。 tuple的第一个元素加和,tuple的第二个元素加和
  • 结果 (age, (totalFriends, totalInstances))
    val totalsByAge = rdd.mapValues(x => (x, 1)).reduceByKey( (x,y) => (x._1 + y._1, x._2 + y._2))
image.png

Filter

括号里写一个返回布尔值的函数
val minTemps = parsedLines.filter(x=>x._2 == "TMIN")

Map & FlatMap

Map是一对一的转换,row in row out
FlatMap是一对多的转换


image.png

正则表达式
\\W+

项目总结

RatingsCounter

数据

  1. 创建一个sc对象,读取数据
  2. lines为RDD,每行为一个String
  3. map 每行执行行数,提取第三列 。存入ratings(RDD)
  4. countByValue 对所有行统计,每个unique值计数。results(Map[String,Long])
  5. results.toSeq.sortBy(_._1) Map可以排序,按照第一列
    6.打印 foreach(println)
val sc = new SparkContext("local[*]", "RatingsCounter")
val lines = sc.textFile("data/ml-100k/u.data")

MaxTemperatures

  1. parseLine 函数 :读入one line,返回tuple
    var fields = lines.split(",")
    val.toFloat val.toInt

  2. rdd.filter(x => x._2 == "TMAX")

  3. reduceByKey

  4. result = rdd.collect() 这时才会计算。

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容

  • Spark算子总结 算子分类 Transformation(转换)转换算子含义map(func)返回一个新的RDD...
    ronnie_yuan阅读 518评论 0 0
  • 17.分区分桶的区别,为什么要分区 分区表:原来的一个大表存储的时候分成不同的数据目录进行存储。如果说是单分区表,...
    qydong阅读 601评论 0 0
  • http://homepage.cs.latrobe.edu.au/zhe/ZhenHeSparkRDDAPIEx...
    scandly阅读 418评论 0 1
  • 1、RDD RDD(Resilient Distributed Dataset弹性分布式数据集)是Spark中抽象...
    青禾ws阅读 643评论 2 3
  • http://spark.apache.org/docs/latest/api/python/index.html...
    mpro阅读 6,090评论 0 4