Scala04
回顾:
1、继承(子类和父类之间的继承)
注意:在new子类的时候需要调用父类的构造器
new子类的时候触发父类的构造方法
2、抽象类
在scala中,属性或方法只有定义没有实现,方法没有返回,属性没有值;new的时候最最底层的那个抽象类,那个子类要实现抽象类的所有方法。
3、trait(接口)
4、val l = List(1,2,3,4,5,6,7,8,9)
l.map(_*2)
5、reduce、reduceLeft、reduceRight、fold
6、flatMap
1、字符串差值和多行
package com.ruozedata.bigdata
object stringApp {
def main(args: Array[String]): Unit = {
// val name = "若泽"
// println(("name is " + name))
//
// //String Interpolation
// println(s"name is:$name")
val mul =
"""欢迎来到若泽数据
|这里是第六期实战班
|好好学习天天向上
""".stripMargin
println(mul)
}
}
shift+: 连续按三次,输入三行各自回车
2、读文件、URL
导包:import scala.io.Source
val lines = Source.fromFile("C:\\Users\\Administrator\\Desktop\\hadoop-click-log.txt")
for (line <- lines){
print(line)
}
等价于==>
for (line <- lines.getLine()){
println(line)
}
在spark中读取本地文件是常有的事
读取URL:
val lines = Source.fromURL("https://www.2345.com")
for (line <- lines.getLines()){
print(line)
}
举例:spark程序要从微服务中跟接口(restful)获取文件路径
scala去读取网络资源。HttpClient,scala直接调Java中的东西。
Scala工程如何做到要能支持Java,
main下新建一个Java目录,与scala同级,
1、右键java目录 --> Mark Directory as --> Sources Root;
2、在Java目录下新建一个包,com.ruozedata.bigdata.java
3、新建一个Java class 名字叫User,定义一个id,一个name,输入getter、setter方法。
User.java中的代码如下:
public class User{
private int id;
private String name;
public void eat() {
System.out.println(this.name + "十分给力" + "排名第" + this.id);
}
public int getId(){
return id;
}
public String getName(){
return name;
}
public void setId(int id){
this.id = id
}
pblic void setName(String name){
this.name = name
}
}
新建ScalaJavaApp.scala文件,
package scala04
import com.ruozedata.bigdata.java.User
object ScalaJavaApp {
def main(args: Array[String]): Unit = {
val user = new User()
user.setName("若泽数据")
user.setId(1)
user.eat()
}
}
输出结果:若泽大数据 十分给力 排名第 1
比如说有非常多的工具类:common-io langs lang
这些Java工具类不用重写可以使用scala直接调用。
RestFul风格:
http://hadoop001:9200/es/student/1
http://hadoop001:9200:请求地址
es/student/1 :要在es索引库中查student是1的信息。
GET
POST
DELETE
PUT
HEAD
通过scala操作hdfs的案例
代码如下但是报错:
package scala04
import java.net.URI
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{FileSystem, Path}
object HDFSApp {
def main(args: Array[String]): Unit = {
val configuration = new Configuration()
val fileSystem = FileSystem.get(new URI("hdfs://10.0.0.1:8020"),configuration)
val flag = fileSystem.mkdirs(new Path("/ruozedata"))
println(flag)
}
}
需求:把一个文件写到hdfs上,通过hadoop fs -ls /ruozedatag6 查看文件是否被写入。
// val out = fileSystem.create(new Path("/ruozedata/g6.txt"))
// out.write("若泽数据".getBytes)
// out.flush()
// out.close()
需求:改名
val src = new Path("/ruozedatag6/g6.txt")
val dst = new Path("/ruozedatag6/g6_1.txt")
val flag = fileSystem.rename(src,dst)
println(flag)
走一个,hadoop fs -ls /ruozedatag6/g6_1.txt
需求:删除操作
val flag = fileSystem.delete(new Path("/ruozedatag6")) //delete的描述f: path, recursive : Boolean recursive的意思是递归。
println(flag)
重头戏:集合
大白话:集合就是一个框,什么东西都往里面装
例如:鸡蛋、橘子==>箱子
泥土==> 直接铲了丢进去
不一样的东西采用不一样的框
数组:List Set Map Seq…
数组定义: 长度、都是一个数据类型的:String/Int/Double
定长:长度一经定义不可变
定义
赋值
取值
边长:长度可以变化
建议在Hadoop下的scala界面操作:
1、赋空值
def main(args:Array[String]):Unit = {
// 定义了一个长度为5的Array,里面装的是String
val a = new Array[String](5)
}
输出结果:Array[Stirng] = Array[null,null,null,null,null]
scala>a
输出:Array[Stirng] = Array[null,null,null,null,null]
scala>a.length
输出:Int = 5
scala>a(2)="若泽数据"
输出:Array[String] = Array[null,null,若泽数据,null,null]
2、赋值
val b = Array("john","sail","earth")
scala>b(1)
res1:sail
scala>b(2)
res2:earth
scala>b.length
res3:Int = 3
scala>b(4)
java.lang.ArrayIndexOutOfBoundsException: 3 //提示数组下标越界
修改数组中的值:
scala>b(1) = "Ron"
scala>b
res6:Array[String] = Array(john, Ron, earth)
3、长的数组
scala> val c = (1,2,3,4,5,6,7,8,9)
scala>c.max
res2:9
scala>c.count(_>2)
res3:Int = 7
4、可能会用到的东西
b.mkString //把所有字符连在一起的
Array这个已经new了长度为3的字符串类型的定长数组。
**array.scala**中源码:
/** Creates an array of `Unit` objects */
def apply(x: Unit, xs: Unit*): Array[Unit] = {
val array = new Array[Unit](xs.length + 1)
array(0) = x
var i = 0
for (x <- xs.iterator) { array(i) = x; i += 1 }
array
}
剖析:xs:"john","sail","earth"
i = 0
array(0) = john
i = 1
array(1) = sail
i = 2
array(2) = earth
val array = new Array[String](3)
array(0) = john
array(1) = sail
array(2) = earth
返回一个array
Array() ==> Array Object.apply
Array使用层面没有new,但是我们查看Array.scala源码发现还是new出来的,调用的是array.scala中的apply方法。
推荐阅读