scala言語におけるcaseキーワードの3つの用途とsparkにおける特殊な使い方
scalaではcaseキーワードには様々な用途がありますは、例えば のようなモードマッチングとして使用することができる.は、クラスclassの前にcase classとして宣言する を使用することができる.
classの前にcaseを追加すると、equal、hashcode、toString、copyメソッド、および彼の伴生オブジェクトが自動的に生成され、伴生オブジェクトにapply、unapplyメソッドが生成されます.たとえばバイアス関数 を作成するために使用する.
case文は本質的にPartialFunctionのサブクラスであるからです.したがって、Scalaでは、「{}」に含まれる一連のcase文は、関数の数値面量と見なすことができる.例:
second関数の機能は、1つのList[Int]の2番目の値を返すことです.Case関数体は,1つのListの長さが2より大きい場合にのみ,Nilと長さが1のリストを無視する.
caseキーワードのsparkへの応用
まず、バイアス関数について説明します.
Scalaでは、すべてのバイアス関数のタイプがPartialFunction[-A,+B]タイプとして定義され、PartialFunction[-A,+B]はFunction 1から派生する.入力パラメータの一部のブランチのみを処理するため、isDefineAt()によって入力値が現在のバイアス関数で処理されるべきかどうかを判断します.
バイアス関数は次のようになります.
1)は、タイプAをタイプBに変換する特質である.
2)Aタイプの入力パラメータを受け入れ、戻り値はBタイプとする.
3)は1元の関数で、"-"記号はタイプに作用してインバータを表し、-Aは入力パラメータがAタイプまたはAタイプの親であることを示し、つまり入力パラメータはAのサブセットであり、"部分"の意味を持つべきである.
4)関数はA定義ドメイン(Type)タイプから「バイアス」されて値ドメインBとなる可能性があり,+はBまたはBのサブクラスであり,「すべて」の意味を持つことを示す.
次の処理PairRddのコードを確認します.
なぜならline.1のタイプは自動的にAnyと推定されるので、asInstanceOfを使用してIntの参照タイプに変換する必要があります.
caseキーを使用して次のように書くことができます.
これは,バイアス関数の特質3:Aが入力パラメータがA型またはA型の親であることを示しているため,この匿名関数は合法である.
このように書くと、関数式プログラミングのスタイルに合致し、バイアス関数の定義ドメインの範囲内にないパラメータを入力しようとすると、異常が放出されます.関数を呼び出す前に、パラメータがドメイン範囲を定義して例外を放出しないようにするかどうかを確認したい場合は、バイアス関数のisDefinedAtメソッドを使用します.
リファレンス Scala偏関数
var arr = Array(1,2,3,4,5,6)
arr.foreach(i => {
case 1 => println("==1")
case _ => println("!=1")
})
classの前にcaseを追加すると、equal、hashcode、toString、copyメソッド、および彼の伴生オブジェクトが自動的に生成され、伴生オブジェクトにapply、unapplyメソッドが生成されます.たとえば
case class People(name:String)
val ma = People.apply("Jack")
println(ma.name)
case文は本質的にPartialFunctionのサブクラスであるからです.したがって、Scalaでは、「{}」に含まれる一連のcase文は、関数の数値面量と見なすことができる.例:
val second:PartialFunction[List[Int],Int] = {
case List(x::y::_) => y
}
second関数の機能は、1つのList[Int]の2番目の値を返すことです.Case関数体は,1つのListの長さが2より大きい場合にのみ,Nilと長さが1のリストを無視する.
caseキーワードのsparkへの応用
まず、バイアス関数について説明します.
Scalaでは、すべてのバイアス関数のタイプがPartialFunction[-A,+B]タイプとして定義され、PartialFunction[-A,+B]はFunction 1から派生する.入力パラメータの一部のブランチのみを処理するため、isDefineAt()によって入力値が現在のバイアス関数で処理されるべきかどうかを判断します.
バイアス関数は次のようになります.
1)は、タイプAをタイプBに変換する特質である.
2)Aタイプの入力パラメータを受け入れ、戻り値はBタイプとする.
3)は1元の関数で、"-"記号はタイプに作用してインバータを表し、-Aは入力パラメータがAタイプまたはAタイプの親であることを示し、つまり入力パラメータはAのサブセットであり、"部分"の意味を持つべきである.
4)関数はA定義ドメイン(Type)タイプから「バイアス」されて値ドメインBとなる可能性があり,+はBまたはBのサブクラスであり,「すべて」の意味を持つことを示す.
次の処理PairRddのコードを確認します.
val zipped = data.rdd.map((s :Row) => s(0)).zip(tfidf)
val originData = zipped.map( line => LabeledPoint(line._1.asInstanceOf[Int], line._2))
なぜならline.1のタイプは自動的にAnyと推定されるので、asInstanceOfを使用してIntの参照タイプに変換する必要があります.
caseキーを使用して次のように書くことができます.
val zipped = data.rdd.map((s :Row) => s(0)).zip(tfidf)
val originData = zipped.map{ case (x1 :Int, x2 :Vector) => LabeledPoint(x1, x2) }
これは,バイアス関数の特質3:Aが入力パラメータがA型またはA型の親であることを示しているため,この匿名関数は合法である.
このように書くと、関数式プログラミングのスタイルに合致し、バイアス関数の定義ドメインの範囲内にないパラメータを入力しようとすると、異常が放出されます.関数を呼び出す前に、パラメータがドメイン範囲を定義して例外を放出しないようにするかどうかを確認したい場合は、バイアス関数のisDefinedAtメソッドを使用します.
リファレンス