タグ付けされた質問 「scala」

Scalaは、主にJava仮想マシンを対象とする汎用プログラミング言語です。一般的なプログラミングパターンを簡潔、エレガント、タイプセーフな方法で表現するように設計されており、命令型プログラミングと関数型プログラミングのスタイルを融合しています。その主な機能は次のとおりです。型推論を持つ高度な静的型システム。関数タイプ; パターンマッチング; 暗黙的なパラメータと変換。演算子のオーバーロード。Javaとの完全な相互運用性。並行性

15
2つのマップをマージして同じキーの値を合計する最良の方法は?
val map1 = Map(1 -> 9 , 2 -> 20) val map2 = Map(1 -> 100, 3 -> 300) それらをマージし、同じキーの値を合計したいと思います。したがって、結果は次のようになります。 Map(2->20, 1->109, 3->300) 今私は2つの解決策を持っています: val list = map1.toList ++ map2.toList val merged = list.groupBy ( _._1) .map { case (k,v) => k -> v.map(_._2).sum } そして val merged = (map1 …
179 scala  map  merge 

2
ScalaとPythonのSparkパフォーマンス
ScalaよりPythonの方が好きです。しかし、SparkはScalaでネイティブに記述されているため、明らかな理由により、コードがPythonバージョンよりもScalaで高速に実行されることを期待していました。 その前提で、1 GBのデータ用の非常に一般的ないくつかの前処理コードのScalaバージョンを学び、書くことを考えました。データはKaggleのSpringLeafコンテストから選択されます。データの概要を説明するだけです(1936のディメンションと145232の行が含まれています)。データは、int、float、string、booleanなどのさまざまなタイプで構成されます。Spark処理には8つのうち6つのコアを使用しています。そのminPartitions=6ため、すべてのコアに処理対象があるように使用しました。 Scalaコード val input = sc.textFile("train.csv", minPartitions=6) val input2 = input.mapPartitionsWithIndex { (idx, iter) => if (idx == 0) iter.drop(1) else iter } val delim1 = "\001" def separateCols(line: String): Array[String] = { val line2 = line.replaceAll("true", "1") val line3 = line2.replaceAll("false", "0") val vals: Array[String] = line3.split(",") …

5
(なぜ)RDDでキャッシュを呼び出すか、永続化する必要があるか
弾力性のある分散データセット(RDD)がテキストファイルまたはコレクション(または別のRDD)から作成された場合、RDDデータをメモリに格納するために「キャッシュ」または「永続化」を明示的に呼び出す必要がありますか?または、RDDデータはデフォルトでメモリに分散して保存されますか? val textFile = sc.textFile("/user/emp.txt") 私の理解では、上記の手順の後、textFileはRDDであり、ノードのメモリのすべてまたは一部で使用できます。 もしそうなら、なぜtextFile RDDで「キャッシュ」または「持続」を呼び出す必要があるのですか?
171 scala  apache-spark  rdd 

3
Scalaの識別子は「暗黙的に」何ですか?
implicitlyScalaの例で使用されているという名前の関数を見てきました。それは何ですか、それはどのように使用されますか? ここに例: scala> sealed trait Foo[T] { def apply(list : List[T]) : Unit }; object Foo { | implicit def stringImpl = new Foo[String] { | def apply(list : List[String]) = println("String") | } | implicit def intImpl = new Foo[Int] { | def apply(list : List[Int]) = println("Int") | …
169 scala  implicits 

13
Scalaでのロギング
Scalaアプリケーションでロギングを行う良い方法は何ですか?言語哲学と一致し、コードが乱雑にならないもので、メンテナンスが少なく、邪魔にならないもの。基本的な要件のリストは次のとおりです。 簡単な コードを散らかしません。Scalaはその簡潔さの点で優れています。コードの半分をステートメントのロギングにしたくない 残りのエンタープライズログと監視ソフトウェアに合わせてログ形式を変更できます ロギングのレベルをサポート(つまり、デバッグ、トレース、エラー) ディスクやその他の宛先(ソケット、コンソールなど)にログを記録できます 最小構成(ある場合) コンテナーで動作します(つまり、Webサーバー) (オプションですが、使いやすい)言語の一部またはMavenアーティファクトのいずれかで提供されるため、ビルドをハックして使用する必要はありません 私は既存のJavaロギングソリューションを使用できることを知っていますが、それらは上記の少なくとも2つ、つまりクラッターと構成で失敗します。 お返事ありがとうございます。
168 logging  scala 

13
コレクションをキーごとに変換するScalaの最良の方法?
私がコレクションしている場合cのタイプのをTとプロパティがあるp上T(タイプのP、たとえば)、行うための最善の方法何であるマップ・バイ・抽出-keyは? val c: Collection[T] val m: Map[P, T] 1つの方法は次のとおりです。 m = new HashMap[P, T] c foreach { t => m add (t.getP, t) } しかし、今は変更可能なマップが必要です。これを1行にして、不変の Map を作成するためにこれを行うより良い方法はありますか?(明らかに、Javaの場合と同様に、上記を単純なライブラリユーティリティに変えることができますが、Scalaでは必要がないと思います)

6
Scalaのレイジーバリューの(隠された)コストはいくらですか?
Scalaの便利な機能の1つはですlazy val。この機能では、val(最初のアクセス時に)必要になるまでaの評価が遅延されます。 もちろん、aにlazy valは多少のオーバーヘッドが必要です。複数のスレッドが初めて値に同時にアクセスしようとする可能性があるため、Scalaは値がすでに評価されているかどうかを追跡し、評価を同期する必要があります。 正確には何のコストですか?評価されているかどうかを追跡するためににlazy val関連付けられている非表示のブールフラグlazy valはありますか?正確に同期されているものはありますか?それ以上のコストはありますか? さらに、私がこれを行うと仮定します: class Something { lazy val (x, y) = { ... } } これは、2つの別個lazy valのを持っているのと同じですかx、yまたはペアのオーバーヘッドを1回だけ取得します(x, y)か?


8
Scala対Java、パフォーマンスとメモリ?[閉まっている]
現在のところ、この質問は、Q&A形式には適していません。事実、参考文献、専門知識によって回答が裏付けられることを期待していますが、この質問は、討論、議論、投票、または拡張ディスカッションを求める可能性があります。この質問が改善され、場合によっては再開できると思われる場合は、ヘルプセンターにアクセスしてください。 7年前休業。 私はScalaを調べたくて、答えを見つけることができないように思えない基本的な質問があります。一般的に、ScalaとJavaの間でパフォーマンスとメモリの使用量に違いはありますか?

6
Scalaでのdef、val、varの使用
class Person(val name:String,var age:Int ) def person = new Person("Kumar",12) person.age = 20 println(person.age) これらのコード行は12、person.age=20正常に実行された場合でも出力されます。これは、でdefを使用したために発生することがわかりましたdef person = new Person("Kumar",12)。varまたはvalを使用すると、出力はになり20ます。私はデフォルトがscalaのvalであることを理解しています。この: def age = 30 age = 45 ...デフォルトではvalであるため、コンパイルエラーが発生します。上記の最初の行が正しく機能せず、エラーも発生しないのはなぜですか?
158 scala 

16
非同期のjdbc呼び出しは可能ですか?
データベースへの非同期呼び出しを行う方法はあるのでしょうか。 たとえば、処理に非常に長い時間がかかる大きなリクエストがあるとします。リクエストを送信し、リクエストが値を返すときに(リスナー/コールバックなどを渡すことによって)通知を受け取りたいと考えています。データベースが応答するのを待つのをブロックしたくありません。 スレッドのプールを使用することは、スケーリングしないので解決策であるとは思いません。大量の同時リクエストの場合、これは非常に多数のスレッドを生成します。 この種のネットワークサーバーの問題に直面しており、select / poll / epollシステムコールを使用して、接続ごとに1つのスレッドが存在しないようにすることで解決策を見つけました。データベースリクエストで同様の機能を使用する方法を知りたいだけですか? 注:FixedThreadPoolを使用するのが適切な回避策である可能性があることは承知していますが、(余分なスレッドを使用せずに)本当に非同期のシステムを開発した人がいないことに驚いています。 **更新** 実際の実用的なソリューションがないため、私は自分でライブラリ(finagleの一部)を作成することにしました:finagle-mysql。それは基本的にmysql要求/応答をデコード/デコードし、内部でFinagle / Nettyを使用します。接続数が非常に多い場合でも、非常によく拡張されます。


6
jarをSparkジョブに追加する-spark-submit
確かに...それはかなり議論されてきました。 ただし、あいまいさが多く、いくつかの回答が提供されています。jars/ executor / driver構成またはオプションでのjar参照の複製を含みます。 あいまいまたは省略された詳細 次のあいまいさに従って、不明確な、および/または省略された詳細は、各オプションについて明確にされるべきです: ClassPathへの影響 運転者 エグゼキューター(実行中のタスク用) 両方とも どういたしまして 区切り文字:コンマ、コロン、セミコロン 提供されたファイルが自動的に配布される場合 タスク(各エグゼキューターへ) リモートドライバー用(クラスターモードで実行した場合) 受け入れられるURIのタイプ:ローカルファイル、hdfs、httpなど 共通の場所にコピーした場合、その場所は(hdfs、local?) 影響を受けるオプション: --jars SparkContext.addJar(...) 方法 SparkContext.addFile(...) 方法 --conf spark.driver.extraClassPath=... または --driver-class-path ... --conf spark.driver.extraLibraryPath=...、または --driver-library-path ... --conf spark.executor.extraClassPath=... --conf spark.executor.extraLibraryPath=... 忘れないでください。spark-submitの最後のパラメーターも.jarファイルです。 メインのSparkドキュメントがどこにあるか、具体的には送信方法、使用可能なオプション、およびJavaDocについて知っています。しかし、それでも部分的には答えましたが、まだかなりの穴が残っています。 それほど複雑ではなく、誰かが私に明確で簡潔な答えを出してくれることを願っています。 ドキュメントから推測する--jarsと、SparkContext addJarとaddFileメソッドはファイルを自動的に配布するものであり、他のオプションはClassPathを変更するだけです。 簡単にするために、3つの主要なオプションを同時に使用して追加のアプリケーションjarファイルを追加できると想定しても安全でしょうか。 spark-submit --jar additional1.jar,additional2.jar \ --driver-library-path additional1.jar:additional2.jar \ …


14
Scalaの演算子が「良い」のに、C ++の「悪い」のオーバーロードが発生するのはなぜですか。
C ++での演算子のオーバーロードは、多くの人にとってA Bad Thing(tm)であると考えられており、新しい言語ではミスを繰り返さないでください。確かに、これはJavaの設計時に特に削除された機能の1つでした。 Scalaについて読み始めたところ、演算子のオーバーロードに非常によく似ていることがわかりました(ただし、技術的には演算子がないため、関数だけなので、演算子のオーバーロードはありません)。ただし、C ++での演算子のオーバーロードとは質的に異なるようには思われません。C++では、演算子は特別な関数として定義されています。 それで私の質問は、Scalaで "+"を定義するアイデアがC ++でのアイデアよりも優れている理由は何ですか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.