欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Scala04

程序员文章站 2022-06-14 16:55:16
...

回顾:
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方法。

推荐阅读