2020-03-19 12:56:30    17    0    0

一. 工具准备

首先准备一个 ubuntu18.04.3 的server版操作系统,确保能正常上网,在该操作系统上进行制作离线包。apt-rdepends 命令能找出指定工具的所有依赖,包括依赖的依赖。

vim /etc/apt/sources.list

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted univer
2020-03-14 22:53:12    18    0    0

    Spark 为包含键值对类型的 RDD 提供了一些专有的操作。这些 RDD 被称为 pair RDD。Pair RDD 是很多程序的构成要素,因为它们提供了并行操作各个键或跨节点重新进行数据分组的操作接口。

 

一. 创建Pair RDD

    在 Spark 中有很多种创建 pair RDD 的方式。很多存储键值对的数据格式会在读取时直接返回由其键值对数据组成的 pair

2020-03-14 12:18:57    8    0    0

一. 导入通配符

*号在Java中是导入通配符,但是在Scala中是合法的方法名,所以导入包时要使用_代替。

import java.util._


二. 类成员默认值

Java中类成员可以不赋初始值,编译器会自动帮你设置一个合适的初始值,而在Scala中必须要显式指定,可以用 _ 让编译器自动帮你设置初始值,注意: 该语法只适用于类成员,而不适用于局部变量。

class Fo
2020-03-13 18:54:40    14    0    0

RDD基础

    Spark 中的 RDD 就是一个不可变的分布式对象集合。每个 RDD 都被分为多个分区,这些分区运行在集群中的不同节点上。RDD 可以包含 Python、Java、Scala 中任意类型的对象,甚至可以包含用户自定义的对象。用户可以使用两种方法创建 RDD:读取一个外部数据集,或在驱动器程序里分发驱动器程序中的对象集合(比如 list 和 set)。

val line
2020-03-13 13:45:41    8    0    0

基本示例

在 Spark 中,通过对分布式数据集的操作来表达我们的计算意图,这些计算会自动地在集群上并行计算。这样的数据集被称为弹性分布式数据集(resilient distributed dataset),简称 RDD。RDD 是 Spark 对分布式数据和计算的基本抽象。

tar -zxf spark-2.4.5-bin-hadoop2.6.tgz
cd spark-2.4.5-bin
2020-03-12 18:56:36    16    0    0

函数内定义函数

和Python一样,也可以在函数内部定义新的函数,新函数的作用域只在当前函数有效

def calcSalary() = {
    def getSalary() = {
        10000
    }
    getSalary * 1.1
}

println(calcSalary)

函数作为参数

val n = List(-11, -10, -5, 0, 5, 10)

// 返回大于 0 的数据
n.filter((x: Int) => x > 0)

// 返回大于 0 的数据
n.filter((x) => x > 0)

// 返回大于 0 的数据:效果同上,简写版本
n.filter(_ > 0)

// 简版的函数定义,这里的待填空下划线必须给定类型,否则报错。
val f=(_: Int) + (_: Int)
f(3,4)
res4: Int = 7

部分应用函数

部分应用函数,简单的来说,其实就是先给函数提前确定一些参数的值,这样一来就形成了新的函数,新函数里面会去调用原来的函数,传入原来格式的参数。

// 当你这样使用下画线时,实际上是在编写一个部分应用的函数(partially applied function)。在Scala中,当你调用某个函数,传入任何需要的参数时,你实际上是应用那个函数到这些参数上
val n = List(-11, -10, -5, 0, 5, 10)
n.foreach(println _)

// 部分应用的函数是一个表达式,在这个表达式中,并不给出函数需要的所有参数,而是给出部分,或完全不给。举例来说,要基于 sum创建一个部分应用的函数,假如你不想给出三个参数中的任何一个,可以在"sum"之后放一个下画线。这将返回一个函数,可以被存放到变量中。
def sum(a: Int, b: Int, c: Int) = a + b + c
val a = sum _
a(1, 2, 3)
res1: Int = 6

// 背后发生的事情是:名为a的变量指向一个函数值对象。这个函数值是一个从Scala编译器自动从sum _ 这个部分应用函数表达式生成的类的实例。由编译器生成的这个类有一个接收三个参数的apply方法。生成的类的apply方法之所以接收三个参数,是因为表达式sum _缺失的参数个数为3
2020-03-11 18:01:50    11    0    0

 变量

shell 中的变量没有类型,都是字符串类型的。

# 命令也可以存放在变量里面,此时 $ct 就相当于 cat
ct=cat
$ct /etc/passwd

变量替换

x=*
echo $x

上面的例子会列出当前目录的所有文件,执行步骤如下:
1. x=*表示将字符*赋给了变量x
2. Shell扫描命令行,将x替换成*
3.Shell重新扫描命令行,遇到*后,使用当前目
2020-03-11 17:47:44    18    0    0

一. getopts函数

  • getopts后面的字符串表示定义的选项列表,每个字母代表一个选项。
  • 后面带:表示该选项有值,后面不带:表示该选项没有值。
  • 如果选项列表中第一个是表示不打印错误信息。
  • 它的缺点:只能使用短选项。为了使用长选项:请使用getopt函数
# test_getopts.sh

#!/bin/bash
usage(){
    command
2020-02-29 01:09:07    9    0    0

 如果是crt或xshell的话需要设置alt为meta键

Ubuntu18.04 tmux 2.6 版本

# BASIC
set -g prefix C-g                             # C-b C-a C-f conflict with cursor move
set -g base-index 1                         
2020-02-29 00:17:44    26    0    0

终端复用神器 tmux


一. 基本概念

tmux采用C/S模型构建,输入tmux命令就相当于开启了一个服务,此时将新建一个会话,然后会话中默认新建一个窗口,窗口中默认新建一个面板。一个tmux session(会话)可以包含多个window(窗口),窗口默认充满整个会话界面,允许在单个窗口中同时访问多个会话,允许每个会话有多个连接窗口,因此可以多人实时共享会话。一个window