scala概述入门

由于做大数据开发,使用最多的语言就是scala和python,java。 刚开始由于spark是scala开发的,就去学习了scala,然后看spark的源码。 后面就是基于spark-core写原生scala的应用。总体来时, scala使用是真的丝滑和顺手。尤其函数式编程。我开发flink也是使用scala。目前很少使用Java了。 我下面就系统介绍一下,scala的内容学习, 我自己也做一个系统的学习补充吧。

这篇主要从scala入门介绍。

scala官网: https://www.scala-lang.org/

Scala combines object-oriented and functional programming in one concise, high-level language. Scala's static types help avoid bugs in complex applications, and its JVM and JavaScript runtimes let you build high-performance systems with easy access to huge ecosystems of libraries.

scala诞生

创始人马丁·奥德斯基(Martin Odersky)是编译器及编程的狂热爱好者,长时间的编程之后,希望发明一种语言,能够让写程序这样的基础工作变得高效,简单。所以当接触到JAVA语言后,对JAVA这门便携式,运行在网络,且存在垃圾回收的语言产生了极大的兴趣,所以决定将函数式编程语言的特点融合到JAVA中,由此发明了两种语言(Pizza & Scala)

与java的关系

它运行在Java虚拟机(JavaVirtualMachine)之上,轻松实现和丰富的Java类库互联互通。scala和java程序都是编译成.class文件,然后在jvm上运行。

所以,如果没有java基础,还是建议先学java基础。 scala很多实现机制都是在java基础上实现的。比如,伴生对象,成员变量,静态方法等, 这些都要反编译 .class文件去看编译的java代码的。

scala语言特点

  • Scala是一门以java虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言。
  • Scala 是一门多范式 (multi-paradigm) 的编程语言,Scala支持面向对象和函数式编程
  • Scala源代码(.scala)会被编译成Java字节码(.class),然后运行于JVM之上,并可以调用现有的Java类库,实现两种语言的无缝对接。[案例演示]
  • scala单作为一门语言来看, 非常的简洁高效 (三元运算, ++ , --,map,reduce等)
  • Scala 在设计时,马丁·奥德斯基 是参考了Java的设计思想,可以说Scala是源于java,同时马丁·奥德斯基 也加入了自己的思想,将函数式编程语言的特点融合到JAVA中, 因此,对于学习过Java的同学,只要在学习Scala的过程中,搞清楚Scala 和 java相同点和不同点,就可以快速的掌握Scala这门语言
  • scala像python一样,一切皆对象。函数也是一等公民。(后面会介绍如何实现一切皆对象的)

注意: 这里介绍了函数式编程概念, 大家下去可以了解一下 命令式编程和函数式编程的概念和不同。

scala安装 以及 idea集成环境配置

scala的安装方式有很多种, 大家注意版本,比如做spark开发,以及一些apache的软件都有scala版本的要求。 注意版本匹配。

mac:

brew update
brew install scala

另一种就是下载 二进制包 直接安装

具体安装以及idea配置,就不说了。我认为你会的。

REPL环境使用

示例代码

spark代码

object Wd {
  def main(args: Array[String]): Unit = {
    // 配置, 运行环境
    val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("WordCount")

    // 上下文对象
    val sc = new SparkContext(sparkConf)

    // 读取文件,将文件内容一行一行的读取出来

    // 如果从本地中使用 file://
    val lines: RDD[String] = sc.textFile("file://Users/youdi/Project/javaProject/sparkOne/input")

    val words: RDD[String] = lines.flatMap(_.split(" "))
    val wordToOne: RDD[(String, Int)] = words.map((_, 1)) // tuple 2

    // 分组聚合
    val wordSum: RDD[(String, Int)] = wordToOne.reduceByKey(_ + _)

    val array: Array[(String, Int)] = wordSum.collect()
    array.foreach(println)
  }

}

flink代码:

package org.youdi.wc

import org.apache.flink.api.java.utils.ParameterTool
import org.apache.flink.streaming.api.scala._

object StreamWordCount {
  def main(args: Array[String]): Unit = {

    val parameters: ParameterTool = ParameterTool.fromArgs(args)
    val host: String = parameters.get("host")
    val port: Int = parameters.getInt("port")


    val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment

    //    env.disableOperatorChaining()
    // 接收socket数据流
    val textDataStream: DataStream[String] = env.socketTextStream("localhost", 7777)

    val wordCountStream: DataStream[(String, Int)] = textDataStream.flatMap(_.split(" "))
      .filter(_.nonEmpty).disableChaining()
      .map((_, 1)).startNewChain()
      .keyBy(0)
      .sum(1)

    wordCountStream.print().setParallelism(1)

    // 打印输出
    env.execute("stream word count job")

    //    6> (youdi,1) 线程数据
    //1> (nihao,1)
  }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • scala变量

    scala中变量的声明是使用 var和val。var 修饰的对象引用可以改变,val 修饰的则不可改变,但对象的状态却是可以改变的。

    若与
  • hadoop介绍

    Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。

    若与
  • solidity语言介绍以及开发环境准备

    若与
  • 两天了解scala

    最前面的话 因为spark的源语言是scala,所以,为了看懂spark的操作并且为了以后看spark源码做准备,先看scala还是很有必要的。另外这里主要是看...

    用户1148523
  • Apache Flink Table API的Catalog

    “ Apache Flink的Table API提供了对数据注册为Table的方式, 实现把数据通过SQL的方式进行计算。Table API与SQL API实现...

    CainGao
  • 山海传说ai 设计

    一 城镇ai: 1.1 任务npc ai:当鼠标指向时,npc头顶会出现名字。并高亮显示npc模型。鼠标移开 后npc恢...

    李海彬
  • GEO数据库可能遇到的问题 (一)

    昨天介绍完GEO2R之后其实该和大家说一下富集分析相关的东西了(昨日链接:GEO2R差异表达分析软件)。但是,由于GEO数据库里面的数据种类比较多...

    匹咔球
  • 如何在Power Query中获取数据——表格篇(5)

    Table.RemoveRowsWithErrors(table as table, optionalcolumns as nullablelist) as t...

    逍遥之
  • 2-MSP430按键输入检测

    为了写一篇文章做铺垫--提醒着自己,,,,,, P1.0的电平,随着P1.1引脚输入的电平变化而变化 #include "io430.h" void delay...

    杨奉武
  • 腾讯云CLB的7层监听器URL转发规则优先级

    使用腾讯云的CLB产品,很多场景会用到http或者https监听器,使用http(s)监听器,在设置具体转发规则的时候,需要注意各个规则的优先级,...

    拾荒者peanutchen

扫码关注云+社区

领取腾讯云代金券