Spark ビッグデータ分析と実践メモ (第 1 章 Scala 言語の基礎-2)

章のまとめ

Spark は、大規模なデータ処理用に設計された高速かつ汎用のコンピューティング エンジンです。Scala 言語によって開発および実装されています。ビッグ データ テクノロジに関しては、データそのものをコンピューティングするものであり、Scala はオブジェクト指向組織プロジェクト エンジニアリング機能の両方を備えていますデータを計算する機能、および Spark と Scala の緊密な統合について説明します。この本では、Scala 言語を使用して Spark プログラムを開発します。そのため、Scala をよく学ぶことは、Spark フレームワークをよりよく理解するのに役立ちます。

1.2 Scalaの基本構文

1.2.1 値と変数の宣言

Scala には 2 種類の変数があり、1 つはキーワード var で宣言された変数であり、その値は変更可能です。もう 1 つは、キーワード val で宣言され、定数とも呼ばれる変数で、その値は不変です。

  • キーワード var で宣言された変数
    var myVar:String="Hello"
  • キーワード val で宣言された変数
    val age:Int=10

注意すべき点がいくつかあります。

  1. Scala の変数は、宣言時に初期化する必要があります。
  2. var を使用して宣言された変数は、初期化後に再度変数に割り当てることができます。
  3. val で宣言された定数の値を再代入することはできません。

変数を宣言するときに、変数の型を指定する必要はありません。初期化時に、Scala の型推論メカニズムが変数の初期化された値に基づいて自動的に計算できるためです。

変数 myVar と age を宣言する上記のコードは、次のコードと同等です。

var myVar = "Hello"   //使用关键字var声明的变量

val age = 10           //使用关键字val声明的变量

注: キーワード var または val を使用して変数を宣言する場合、直後の変数名を Scala の予約語と同じにすることはできません。また、変数名は文字またはアンダースコアで始めることができ、変数名の大文字と小文字は厳密に区別されます。 -センシティブ。

1.2.2 データ型

  • どのプログラミング言語にも特定のデータ型があり、Scala も例外ではありません。
  • 他の言語とは対照的に、Scala では数値や関数を含むすべての値に型があります。

Scala におけるデータ型の階層
ここに画像の説明を挿入
上の図からわかるように、Any はすべての型のスーパータイプであり、トップレベル型とも呼ばれ、次のように 2 つの直接のサブクラスが含まれています。

  • AnyVal: 値の型を示し、値の型で記述されるデータは空ではなく、オブジェクトでもありません。Double、Float、Long、Int、Short、Byte、Unit、Char、Boolean の 9 種類が事前定義されています。このうちUnitは意味を持たない値型であり、その機能はJavaにおけるvoidに似ています。

  • AnyRef: 参照タイプを示します。値を除くすべての型は AnyRef を継承すると考えられます。

Scala データ型階層の最下位には、次のように、さらに 2 つのデータ型、つまり Nothing と Null があります。

  • なし: すべてのタイプのサブタイプ。ボトム タイプとも呼ばれます。その使用目的は、例外のスロー、プログラムの終了、無限ループなどの終了を通知することです。
  • Null: すべての参照型のサブタイプ。その主な目的は他の JVM 言語と相互運用することであり、Scala コードではほとんど使用されません。

1.2.3 算術演算子と演算子のオーバーロード

Scala の算術演算子 (+、-、​​、/、%) は、ビット演算子 (&、|、>>、<<) と同様に Java と同じように機能します。Scala のこれらの演算子は実際にはメソッドであることが特に強調されます。たとえば、a+b は実際には a.+(b) の短縮形です。
ここに画像の説明を挿入
注: Scala には演算子 ++ と – がありません。増加または減少の効果を実現したい場合は、「+=1」または「-=1」を使用して実現できます。

1.2.4 制御構造ステートメント

Scala では、制御構造ステートメントには条件分岐ステートメントとループ ステートメントが含まれます。このうち、条件分岐文には if 文、if...else 文、if...else if...else 文、if...else ネスト文が含まれ、ループ文には for ループ、while ループ、do が含まれます。 ...while ループ。

  1. 条件分岐文
  • if 条件文
if (布尔表达式){
       语句块
} 
  • if-else 条件文
if (布尔表达式){
        语句块
} else{
        语句块
}
  • if-else-if-else ステートメント
if (布尔表达式1){
        语句块
} else if(布尔表达式2){
         语句块
} else if(布尔表达式3){
       语句块
} else {
       语句块
}
  • if-else ネストされたステートメント
if (布尔表达式1){
       语句块
               if(布尔表达式2){
                      语句块
               }
}else if (布尔表达式3){
        语句块
               else if (布尔表达式4){
                      语句块
                }
}else{
         语句块
}


ここに画像の説明を挿入
2. ループ文Scala
の for 文と Java のループ文は構文が大きく異なりますので、Scala の for ループ文を紹介します。

  • forループ文
for(变量<-表达式/数组/集合){
         循环语句;
}

以下では、0から9までループし、ループするたびに動作デモ用の値を出力します。Scala 構文では、「0 ~ 9」は 0 ~ 9 の範囲を表すために使用でき、範囲には 9 が含まれます。サンプル コードは次のとおりです。

  • Dosコマンドライン
    ここに画像の説明を挿入

  • IDEA での結果は
    ここに画像の説明を挿入
    次のとおりです。
    0 1 2 3 4 5 6 7 8 9

Scala では、for ループ ステートメント内の if 判定ステートメントを使用して一部の要素をフィルターできます。複数のフィルター条件はセミコロンで区切られます。たとえば、0 ~ 9 の範囲で 5 より大きい偶数を出力する場合のサンプルコードは次のとおりです。
ここに画像の説明を挿入

  • while ループ ステートメント
    Scala の while ループ ステートメントは Java の while ループ ステートメントとまったく同じで、構文形式は次のとおりです。

  • while ステートメント

while(布尔表达式){
         循环语句;
}

以下では、奇数の場合を出力することで while の使用法を示します。

変数x=1があったとして、それが10未満かどうかを判断し、10未満であれば出力し、+2演算を行います。

サンプルコードは次のとおりです。
ここに画像の説明を挿入

  • do-while ステートメント
do{
       循环语句;
}while(布尔表达式)

do...while ループ ステートメントと while ステートメントの主な違いは、do...while ステートメントのループ ステートメントが少なくとも 1 回実行されることです。サンプル コードは次のとおりです。
ここに画像の説明を挿入

1.2.5 メソッドと関数

Scala には、Java と同じようにメソッドと関数があります。Scala メソッドはクラスの一部ですが、関数は変数に割り当てることができるオブジェクトです。つまり、クラス内で定義された関数はメソッドです。

Scala では、関数は def ステートメントと val ステートメントを使用して定義できますが、メソッドは def ステートメントを使用してのみ定義できます。以下にScalaのメソッドと機能を説明します。

  1. メソッド
    Scala メソッドの定義形式は次のとおりです。
def functionName ([参数列表]):[return type]={
         function body
         return [expr]
}

以下では、2 つの数値の加算と合計を実現するメソッド add を定義しています。サンプルコードは次のとおりです。

def add(a:Int,b:Int):Int={
  var sum:Int = 0
  sum = a + b
  return sum
}

Scala メソッド呼び出しの形式は次のとおりです。

//没有使用实例的对象调用格式
functionName(参数列表)

//方法使用实例的对象来调用,我们可以使用类似Java的格式(“.”号)
[instance.]functionName(参数列表)

次に、クラス Test で、2 つの整数の加算と合計を実現するメソッド addInt を定義します。ここでは「クラス名.メソッド名(パラメータリスト)」で呼び出す場合のサンプルコードは以下の通りです。

scala> :paste                         # 多行输入模式的命令
// Entering paste mode (ctrl-D to finish)
object Test{
def addInt(a:Int,b:Int):Int={
  var sum:Int =0
  sum = a + b
  return sum
 }
}
// Exiting paste mode, now interpreting. # Ctrl+d结束多行输入模式
defined object Test
scala> Test.addInt(4,5)      # 方法调用
res0: Int = 9
  1. 関数
    Scala の関数は、変数に代入できるオブジェクトです。
    Scala 関数の定義構文は次のとおりです。
val functionName ([参数列表]):[return type]={
           function body
           return [expr]
 }

次に、2 つの整数の加算と合計を実現する関数 addInt を定義します。サンプルコードは次のとおりです。

scala> val addInt =(a:Int,b:Int) => a+b
addInt: (Int, Int) => Int = <function2>
scala> addInt(6,7)
res1: Int = 13
  • メソッドを関数に変換する
    メソッドを関数に変換する形式は次のとおりです。
val f1 = m _

上記の形式では、メソッド名 m の後にスペースとアンダースコアが続き、メソッドを呼び出す代わりにメソッドを関数に変換するようにコンパイラに指示します。次に、メソッド m を関数に変換するメソッド m を定義します。サンプルコードは次のとおりです。

scala> def m(x:Int,y:Int):Int=x*y          # 方法
m: (x: Int, y: Int)Int
scala> val f = m _
f: (Int, Int) => Int = <function2>          # 函数
scala> f(2,3)
res2: Int = 6

注: Scala メソッドの戻り値の型は省略でき、コンパイラが自動的に推論できますが、再帰的メソッドの場合は戻り値の型を指定する必要があります。

転載元: https://blog.csdn.net/u014727709/article/details/132031799
開始へようこそ、コメントへようこそ、修正へようこそ

おすすめ

転載: blog.csdn.net/u014727709/article/details/132031799