2

かなり大きなcsvファイルを読み取って処理します(スライス、ダイス、要約など)interactively(データ探索)。私の考えは、ファイルをデータベース(H2)に読み込み、SQLを使用して処理することです。

  1. ファイルを読む:Ostermillercsvパーサーを使用します

  2. 各列のタイプを決定します。ランダムに50行を選択し、各列のタイプ(int、long、double、date、string)を導き出します。

  3. Squerylを使用して処理したいと思います。そのためには、ケースクラスを動的に作成する必要があります。これがこれまでのボトルネックです。

  4. ファイルをH2にアップロードし、任意のSQLコマンドを使用します。

私の質問:

  • Scalaでこれを行うためのより一般的なインタラクティブな方法はありますか?
  • 3点目を解決する方法はありますか?別の言い方をすれば、タイプのリスト(csvファイルの列に対応)が与えられた場合、Squerylのテーブルに対応するケースクラスを動的に作成することは可能ですか?私の理解では、マクロを使用してそれを行うことができますが、それを行うのに十分な露出がありません。
4

3 に答える 3

3

最初の質問に対するあなたのアプローチは合理的に聞こえると思います。

2 番目の質問については、drexin の回答への追加として、ASMなどのライブラリを使用してバイトコードを生成することができます。このようなライブラリを使用すると、ケース クラスと同じバイト コードを生成できます。

于 2012-05-14T20:39:36.330 に答える
2

scala は静的に型付けされた言語であるため、リフレクション以外にクラスを動的に作成する方法はありません。リフレクションは遅く、危険であるため、避ける必要があります。マクロを使用しても、これを行うことはできません。マクロは実行時ではなくコンパイル時に評価されるため、コンパイル時にデータの構造を知っておく必要があります。データがどのように見えるかさえわからない場合、ケース クラスは何のために必要なのでしょうか? を使用するよりも、これにどのような利点が期待できますMap[String,Any]か?

于 2012-05-14T12:34:44.387 に答える
1

封印された基本クラスを作成し、そのサブクラスとして一連のケース クラスを作成したいと思います。各サブクラスは、サポートする異なるタイプをラップします。

次に、match ステートメントと分解を使用して個々の型を処理し、重要でない場所で基本クラスを介してそれらを一般的に扱うことができます。

コンパイル時に十分な知識がないため、行全体のクラスを作成することはできません。クラスを動的に生成できたとしても (おそらく実行時にコンパイラを呼び出すことによって)、タイプ セーフの恩恵を受けることはできず、ほとんどのコードはとにかくジェネリックに処理する必要があります。

于 2012-06-29T21:01:55.000 に答える