Hatena::ブログ(Diary)

ayakobabaの日記

2012-09-04

[] エクスポートインポート 15:19  エクスポート/インポートを含むブックマーク  エクスポート/インポートのブックマークコメント

何回やってもわすれちゃうので。メモ。エクスポート

hbase org.apache.hadoop.hbase.mapreduce.Driver export (テーブル名) (ファイル名)

インポート

hbase org.apache.hadoop.hbase.mapreduce.Driver import (テーブル名) (ファイル名)

基本的にMapReduceジョブなので、ファイルはHDFSにあります。

2012-02-02

[][] sbt でmainメソッドを実行する方法 16:07  sbt でmainメソッドを実行する方法を含むブックマーク  sbt でmainメソッドを実行する方法のブックマークコメント

sbt でクラスパスにあるクラスのmainメソッドを実行する方法

sbt "run-main com.example.Main arg1 arg2" 

たぶんrun-mainに限らずなのですが、sbt 以下の引数をごっそり"で囲むのがポイント

2011-09-07

[][] case文で型パラメータをつかうとき 15:13  case文で型パラメータをつかうときを含むブックマーク  case文で型パラメータをつかうときのブックマークコメント

Scala でこんなプログラムを書いたとします。

tuple match{
  case t:(Int,String) => println("(Int,String) tuple")
  case _ =>  println("Not a (Int,String) tuple!")
}

これ、コンパイル通ります。ただし、例えば、(String,String)のtuple を渡した場合、2行めのt:(Int,String)にマッチしてしまいます。というのは、バイトコードに変換されてしまうと、tの2要素のタプルであることは判断できるものの、tの各要素の型まではわからなくなってしまうからです。

もう少し詳しくみると、型指定の

 (Int,String)

の部分は、

Tuple2[Int,String] 

というように、Tuple2に型パラメータを指定しているのと同じことですが、この型パラメータの[Int,String]の情報がバイトコードになるとごっそり抜け落ちます。Scalaの型パラメータJavaジェネリクスに変換されるのですが、Javaバイトコード下位互換性を保つためにバイトコード生成時にジェネリクス情報をすべて消し込むerasureモデルを採用するからです。だから、tはTuple2かどうかはわかるけど、Tuple2[Int,String]かはわからない。

同じ理由で以下のコードも「Stringの」Listかどうかは、みてません(みれないから)

list match{
   case l:List[String] => "This is String List!"
   case _ => "This is not a String List!!"
}

なんでこんなことが気になったかというと、このようなコードがScalaDoc生成時にwarningをいっぱいだしたから。warningを出さない方法は、2種類あります。まず、「「Stringの」Listかどうかなんてそんなに気にしないよ。」という場合。このような場合は、

list match{
  case l:List[_] => "This is a List!"
  case _ => "This is not a List!"
}

と、型パラメータの部分を _ にすればよいです。caseのあとの処理のブロックでListの要素に対してString型のメソッドを実行したい場合も、asInstanceOf を利用してキャストすればいけます。(なんとなくちょっと不細工ですが)

問題は、「Stringの」Listだ、ということを検証したい場合です。以下のページでも議論されていますが、ちょっと工夫しないと難しそうです。

http://stackoverflow.com/questions/1094173/how-do-i-get-around-type-erasure-on-scala-or-why-cant-i-get-the-type-parameter

Listの場合は、

  1. Array にする (Java配列ジェネリクスではないから、要素の型の評価ができる)
  2. StringのList をあらわす StringListクラスを作成する

などなどの方法が考えられます。Tupleなどは、2番目の「クラスを作る」という方法をとった方がコードがすっきりしそうな気がします。

今回は文脈上問題なかったので、List[_]の方法を採用しました。いろいろ勉強になります。

2011-08-20

[][] 遅延評価させるには 10:08  遅延評価させるにはを含むブックマーク  遅延評価させるにはのブックマークコメント

Query.listじゃなくて、Query.elements で CloseableIteratorを取得しましょう、と。

2011-08-18

[][]ローカルリポジトリのパスは変わってなかった。 18:32 ローカルリポジトリのパスは変わってなかった。を含むブックマーク ローカルリポジトリのパスは変わってなかった。のブックマークコメント

maven3 だとローカルリポジトリのパスが変わっていますね。 - ayakobabaの日記 って昨日書いたけど、嘘でした!!

会社のCIサーバの設定は、権限もろもろがないのでみれないのですが、ローカルPCにインストールされているmaven3の設定をみたけど、ローカルリポジトリのぱす変わってないし、setting.xmlにも

<!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ~/.m2/repository

って書いてありました。信じてくれたひとごめんなさい。でも私的には川口さんと言葉を交わせたからいいやー。いやしかし驚いたよ。