金曜日, 9月 10, 2010

Solrクエリのパーサ2

以下を忘れいたので、GINによるSolrクエリパーサを改訂しました。

・NOT
・レンジクエリ(pub_date:[2009-10-01T00:00:00Z+TO+*])

// Solrクエリパーサの作成(LL) v0.2

// パーサジェネレータを読込み
load('work\\mod_gin.js');

// パーサを作成(EBNFで文法を定義)
// JS_STRINGはダブルクウォートで括らなくてはならないのでTermを定義して使う
// Termで+記号は定義せず+desc/+ascを別書きとする(+OR+等とかぶるため全体がターム扱いとなる)
// Rangeには[]で括って作られるレンジクエリ用の記述を入れて別出し
var calc = new Gin.Grammar({
Solr: / Object ( '&' Object )* /,
Object: / ( Value '=' Factor ) /,
Factor: / Value ( ',' Factor | '+AND+' Factor | '+OR+' Factor | '+NOT+' Factor )* /,
Value: / Term | '(' Factor ')' /,
Term: / <[a-zA-Z0-9_.]+> ':[' Range ']' | <[a-zA-Z0-9_.:]+(\+desc|\+asc)?> /,
Range: / <[a-zA-Z0-9_.+*\-]+> /
}, "Solr", Gin.SPACE);

// 検証するSolrクエリ
var strInput = 'start=0&q=AREA_CD:050+OR+DISP:1+AND+HAN_CD:011)+AND+EKI_CD:26610+AND+pub_date:[2009-10-01T00:00:00Z+TO+*]&sort=EKI_CD+asc,HAN_CD+desc&wt=javabin&rows=0&version=2.2';

// パーサのデバッグを行うときは以下のコメントを復活
var input = [
// 'q=((AAA:1+AND+BBB:2))&start=1',
// '"q"=(("AAA:x"+AND+"BBB:2")+AND+"CCC:3")&"start"=1&"var"=1.1',
// '"q"=("DDD"+OR+("AAA"+AND+"BBB")+AND+"CCC")&"sort"="test+desc","kkk+asc"&"start"=1',
strInput
];

// 検証!
for (var i = 0; i < input.length; i++) {
var match = calc.parse(input[i]);
if (match && match.full){
print("AST: " + match.value.toSource());
}else{
print(input[i]);
print("Sentence was wrong.");
}
}

月曜日, 8月 09, 2010

Solrクエリのパーサ1

"Days on the Moon"さんのブログを参考に、Solrのクエリを整形(Lint)する目的でパーサを作る実験中です。

以下、なんとなく通った版です(GINはmod_gin.jsとリネームし、rhinoで起動)。

// Solrクエリパーサの作成(LL) v0.1

// パーサジェネレータを読込み
load('work\\mod_gin.js');

// パーサを作成(EBNFで文法を定義)
// JS_STRINGはダブルクウォートで括らなくてはならないのでTermを定義して使う
// Termで+記号は定義せず+desc/+ascを別書きとする(+OR+等とかぶるため全体がターム扱いとなる)
// Termには数字は入ってこない想定(Valueに$REALがあるため)
var calc = new Gin.Grammar({
Solr: / Object ( '&' Object )* /,
Object: / ( Value '=' Factor ) /,
Factor: / Value ( ',' Factor | '+AND+' Factor | '+OR+' Factor )* /,
Value: / $REAL | Term | '(' Factor ')' /,
Term: / <[a-zA-Z0-9:_.]+(\+desc|\+asc)?> /
}, "Solr", Gin.SPACE);

// 検証するSolrクエリ
var strInput = 'start=0&q=(AREA_CD:050+OR+DISP:1+AND+HAN_CD:011)+AND+EKI_CD:26610&sort=EKI_CD+asc,HAN_CD+desc&wt=javabin&rows=0&version=2.2';

// パーサのデバッグを行うときは以下のコメントを復活
var input = [
// 'q=((AAA:1+AND+BBB:2))&start=1',
strInput
];

// 検証!
for (var i = 0; i < input.length; i++) {
var match = calc.parse(input[i]);
if (match && match.full){
print("AST: " + match.value.toSource());
}else{
print(input[i]);
print("Sentence was wrong.");
}
}

月曜日, 7月 19, 2010

rhinoでe4xを使う

Windowsのantでスクリプト実行をしていたのだけど、何故かant経由だとe4xがうまく使えなかった。javaコマンドで直接起動する分には問題ない。

D:\work\blog-gae>java -cp war\WEB-INF\lib\js.jar org.mozilla.javascript.tools.shell.Main work\e4x.js

以下そのときのantのターゲット。

<target name="rhino-run">
<property name="classes" value="war/WEB-INF/lib/js.jar:war/WEB-INF/lib/mailapi.jar:war/WEB-INF/lib/smtp.jar"/>
<echo message="Running ${script}"/>
<java classname="org.mozilla.javascript.tools.shell.Main"
classpath="${classes}"
failonerror="true">
<arg value="${script}" />
</java>
</target>

そのときのe4xテストスクリプトは以下。
// var a = require("test0.js");

var i = '<a><b><c>aaaa</c></b><b><c>bbbb</c></b></a>';

var xml = new XML(i);

//print(xml.a.b.c[1].toString());
//print(xml.a.b.c[1]);

// 何故か先頭要素を省いたものが正解
print(xml.b.c[1]);

エラーは以下のとおり。

D:\work\blog-gae>ant rhino-run -Dscript="work\e4x.js"
Buildfile: build.xml

rhino-run:
[echo] Running work\e4x.js
[java] js: uncaught JavaScript runtime exception: ReferenceError: "XML" is not defined.
[java]

BUILD FAILED
D:\work\blog-gae\build.xml:141: Java returned: 3

Total time: 1 second
D:\work\blog-gae>

これは(やはり)classpathの問題のようで、以下のスクリプト(コチラを参考)でclasspathを出してみると、
var strConf = "java.class.path";
var cwd = environment[strConf];
cwd = cwd.replace(/;/g, "\n");
print(strConf + " = " + cwd);

antのものばかりで、肝心のjs.jarが出ない。

D:\work\blog-gae>ant rhino-run -Dscript="work\env0.js"
Buildfile: build.xml

rhino-run:
  [echo] Running work\env0.js
  [java] java.class.path = D:\work\apache-ant-1.7.1\bin\..\lib\ant-launcher.j
ar
  [java] d:\Documents and Settings\00962724\.ant\lib\ivy-2.0.0-rc2.jar
  [java] D:\work\apache-ant-1.7.1\lib\ant-antlr.jar
  [java] D:\work\apache-ant-1.7.1\lib\ant-apache-bcel.jar
  [java] D:\work\apache-ant-1.7.1\lib\ant-apache-bsf.jar
snip
  [java] D:\work\apache-ant-1.7.1\lib\xercesImpl.jar
  [java] D:\work\apache-ant-1.7.1\lib\xml-apis.jar
  [java] C:\Program Files\Java\jdk1.6.0_18\lib\tools.jar

BUILD SUCCESSFUL
Total time: 1 second
D:\work\blog-gae>

そこで、上記ターゲットにantを実行しているjvmとは別のvmで実行するようforkを入れると、

<target name="rhino-run">
 <property name="classes" value="war/WEB-INF/lib/js.jar:war/WEB-INF/lib/mailapi.jar:war/WEB-INF/lib/smtp.jar">
 <echo message="Running ${script}">
 <java fork="yes" classname="org.mozilla.javascript.tools.shell.Main" classpath="${classes}" failonerror="true">
     <arg value="${script}">
 </arg>
</java>
</echo></property></target>

うまくjs.jarが動くようになり、

D:\work\blog-gae>ant rhino-run -Dscript="work\env0.js"
Buildfile: build.xml

rhino-run:
  [echo] Running work\env0.js
  [java] java.class.path = D:\work\blog-gae\war\WEB-INF\lib\js.jar
  [java] D:\work\blog-gae\war\WEB-INF\lib\mailapi.jar
  [java] D:\work\blog-gae\war\WEB-INF\lib\smtp.jar

BUILD SUCCESSFUL
Total time: 3 seconds
D:\work\blog-gae>

e4xが正常に動作した。

D:\work\blog-gae>ant rhino-run -Dscript="work\e4x.js"
Buildfile: build.xml

rhino-run:
  [echo] Running work\e4x.js
  [java] bbbb

BUILD SUCCESSFUL
Total time: 1 second
D:\work\blog-gae>

検索すると意外にrhinoのバージョン問題か、などいろいろでるけど、1.7R1で正常に使えています

火曜日, 5月 18, 2010

Mahotをウェブアプリで使う

Jteamというサイトに、サンプルアプリが公開されていたのでメモ。
  1. sampleのzipファイル(taste-getting-started.zip)をダウンロードして展開
  2. Mavenを使って"mvn install"
  3. ミネソタ大学のgrouplensというラボから評価用データセット(ml-data_0.zip)を入手
  4. どこかに立てたMySQLにテーブルを作る(taste-getting-started\src\main\resources\sql\initialize_movielens_db.sqlにて)
     ・この中でmovielensという名前でデータベースやユーザが作られる
     ・しかしこのとき作られるユーザはlocalhost縛りになるので注意('@%'に要変更)
     ・ロードするu.itemは変なディレクトリにあることになっているので要変更
  5. taste-getting-started\src\main\webapp\WEB-INF\persistence-context.xmlの接続情報を変更
  6. Mavenを使って"mvn jetty:run"
意外に簡単なのですが、あるべきMoviePage.htmlが入ってなく、、、かつ映画名が良く分からないので、それがレコメンドとして正しいのかの判断が不明です。

月曜日, 3月 22, 2010

appenginejsのアプリ初期化過程

最初のリクエストが飛んできたときに、appenginejsに同梱されているJSGIServlet.javaで行われていることをまとめておきます。
  • コンテキストが作られる
  • narwhalの(engine個別の/ここではrhinoの)bootstrap.jsが実行される
     ここでNARWHAL_HOMEはWEB-INF/packages/narwhalと決め打ち
     その中で(NARWHAL_HOMEの)narwhal.jsが実行され環境が作られる
  • jackのservletハンドラ(proessメソッド)がrequireされる
     アプリは(serviceメソッドから呼ばれ)このハンドラ内で実際に実行される
  • アプリのWEB-INF/src/jackconfig.jsがrequireされる
     (web.xmlの)appとenvironmentに合わせた変数がexportされる
  • 上記exportされた変数(environmentとapp)を使ってアプリが初期化される

月曜日, 3月 08, 2010

hotデプロイなGAE開発!

appenginejsでは、war\WEB-INF\jackconfig.jsの中でlocalとhostedという2つの稼働方法をexportしている。

そして、同ディレクトリにあるweb.xmlの中でenvironmentという名前で指定して利用するのだが、これをlocalにしておけば、ソース修正が(jettyの再起動を行わずとも)反映できるようになる。

なお、jackconfig.jsというファイル、何かの設定ファイルのようだけどなんのことはなく、このファイルが、jack経由でJettyで実行されているだけである(このファイルのexports.app)。

日曜日, 3月 07, 2010

appenginejsでtimezone

blog-gaeでのtimezone設定のやり方が分からず、ずっと時間表示がUTCだった。
調べてみると起動するservletであるjack-servletを最新ソースではこの設定が可能になっていたので差し替え。

ソースを落としたら、D:\work\blog-gaeに展開して、
ant runserver
とするだけで、開発用サーバが8080ポートで上がります。ちなみに、WEB-INF\packages\narwhal\lib\sandbox.jsの6行目にある以下を修正すれば、配置場所は変更可能です(Windowsのディレクトリ記述がうまくパースできないようなので、このファイルは無理に改造しています)。
var zzWork = 'd:\\work\\blog-gae\\war\\WEB-INF\\';

土曜日, 3月 06, 2010

blog-gae

appenginejsのサンプルが動いたので、ソースを上げました。
GAEって、普通にzipファイルを上げたらダウンロードできるようになるんですね。

火曜日, 2月 23, 2010

appenginejsでrunInTransaction!!

appenginejsで、どうしても出来なかった同一トランザクションでのdb登録がやっとできた。GAEでは同一トランザクションでのデータ更新は、
・同じエンティティグループのエンティティ群しかダメ
・(そのためには先に作ってる同一に入れたい)エンティティからキーをもらう必要あり
このための記述が、昔はModelをnewするときの第一引数にキーを渡す方式だった(よう)だが、

×(昔)
var objCom = new Comment(msg.key(),{
msgRef:msg.key(),
content: "This is test comment"
});

今のバージョンではプロパティにparentと切ってそこにキーを渡すことになっている。

(今)
var objCom = new Comment({
parent:msg.key(),
msgRef:msg.key(),
content: "This is test comment"
});

これで、以下のような一括更新が成功するようになる!!
db.runInTransaction(function() {
db.put([objCom,msg]);
});

ちなみに、
agl0ZjAwNTQtMDZyDQsSB01lc3NhZ2UYCQw
というキーを与えたら、
agl0ZjAwNTQtMDZyGgsSB01lc3NhZ2UYCQwLEgdDb21tZW50GAoM
というキーを持った(同一エンティティグループに入った)エンティティができている。

土曜日, 2月 13, 2010

App Engine JavaScript SDK

GAEのアプリをJavascriptで書けるSDK"appenginejs"というのがあるのだけど、公開されているサンプルアプリ(blog-gae)をWindowsで動かすのにえらく苦労したのでメモ。

"app is not function"とかエラーがでるがこれはウソ。
で、やることは大きく2つ。

パスがうまく取り込めないので置換する(配置場所に合わせて適宜変えて下さい)。
変更するファイルは"blog-gae\war\WEB-INF\packages\narwhal\lib\sandbox.js"の1つだけ。

loader.find = function (topId) {
if(topId.match(/\-gae/)){
var zztmp = new Array();
//zztmp = topId.match(/([^\\]+)$/);
zztmp = topId.match(/INF\\(.+)$/);
topId = 'd:\\work\\blog-gae\\war\\WEB-INF\\'+zztmp[1];
}
...

self.find = function (topId) {
if(topId.match(/\-gae/)){
var zztmp = new Array();
zztmp = topId.match(/INF\\(.+)$/);
topId = 'd:\\work\\blog-gae\\war\\WEB-INF\\'+zztmp[1];
}
...

"\blog-gae\war\WEB-INF\src"は本来classesへのシンボリックリンク。
なのだけど、Windowsなのでこれはclassesをsrcという別名でコピーしておく。

これで、起動はやはり重いけど動くことは動く。日本語も使えている様子。

月曜日, 1月 11, 2010

[haXe] aswingを使う(ウィンドウ内に描画)

同様にhaXeにてaswingのウィンドウ内に絵を描く(linetoなど)には、FrameのContainerをとって、そこに、絵が描かれたGroudDecoratorをBackgroundDecoratorとしてセット、するみたいです。。。中国のaswingサイトに例がありました。
import flash.display.Sprite;

import org.aswing.ASColor;
import org.aswing.Component;
import org.aswing.Container;
import org.aswing.JFrame;
import org.aswing.graphics.Graphics2D;
import org.aswing.graphics.IBrush;
import org.aswing.graphics.SolidBrush;

class FillTest extends Sprite
{
public function new()
{
super();
var frame:JFrame = new JFrame(this);
frame.setSizeWH(400, 370);

var c:Container = frame.getContentPane();
c.setBackgroundDecorator(new MyCanvas());

frame.show();
}
}

import org.aswing.GroundDecorator;
import flash.display.Shape;
import org.aswing.Component;
import org.aswing.graphics.Graphics2D;
import org.aswing.geom.IntRectangle;
import flash.display.DisplayObject;
import org.aswing.graphics.IBrush;
import org.aswing.graphics.SolidBrush;
import org.aswing.ASColor;
import org.aswing.graphics.GradientBrush;

import flash.geom.Matrix;

class MyCanvas implements GroundDecorator {

private var shape:Shape;

private var H_GAP:UInt;
private var V_GAP:UInt;

private var WIDTH:UInt;
private var HEIGHT:UInt;

public function new()
{
shape = new Shape();

H_GAP = 10;
V_GAP = 10;

WIDTH = 100;
HEIGHT = 100;
}

public function updateDecorator(com:Component, g:Graphics2D, bounds:IntRectangle):Void {

var g2:Graphics2D = new Graphics2D(this.shape.graphics);
g2.clear();

var rectBounds:IntRectangle = new IntRectangle();

//fill solid rect

rectBounds.x = bounds.x + H_GAP;
rectBounds.y = bounds.y + V_GAP;
rectBounds.width = WIDTH;
rectBounds.height = HEIGHT;

var solidBrush:IBrush = new SolidBrush(ASColor.RED);
g2.fillRectangle(solidBrush, rectBounds.x, rectBounds.y, rectBounds.width, rectBounds.height);

//fill liner grandient rect

rectBounds.y += HEIGHT; // move shape rect
rectBounds.y += V_GAP;

var colors:Array<UInt> = [0x000000, 0xFF0000, 0x00FF00, 0x0000FF, 0x000000];
var alphas:Array<Int> = [0, 1, 1, 1, 0];
var ratios:Array<Int> = [0x00, 0x3F, 0x7E, 0xBD, 0xFF];
var matrix:Matrix = new Matrix();

matrix.createGradientBox(rectBounds.width, rectBounds.height, 0, rectBounds.x, rectBounds.y);
var linear:IBrush = new GradientBrush(GradientBrush.LINEAR, colors, alphas, ratios, matrix);

g.fillRectangle(linear, rectBounds.x, rectBounds.y, rectBounds.width, rectBounds.height);

//fill radial grandient

rectBounds.y += HEIGHT; // move shape rect
rectBounds.y += V_GAP;

matrix.createGradientBox(rectBounds.width, rectBounds.height, 0, rectBounds.x, rectBounds.y);
var radial:IBrush = new GradientBrush(GradientBrush.RADIAL, colors, alphas, ratios, matrix);

g.fillRectangle(radial, rectBounds.x, rectBounds.y, rectBounds.width, rectBounds.height);
}

public function getDisplay(c:Component):DisplayObject {
return this.shape;
}
}
普通にSpriteをJFrameなどにaddChildもできますが、これでは折りたたんだときに表示が残るので。。

[haXe] aswingを使う


haXe(v2.04)でaswing(1_5というパック?)を使う例。
/**
 * Sample002.as
 * Thanks!! -> http://www.matzmtok.com/blog/?p=18
 */

import org.aswing.event.InteractiveEvent ;
import org.aswing.ASColor;
import org.aswing.Container;
import org.aswing.EmptyLayout;
import org.aswing.JSlider;
import org.aswing.JWindow;
import org.aswing.SoftBoxLayout;
import org.aswing.ButtonGroup;
import org.aswing.BoxLayout;
import org.aswing.BorderLayout;
import org.aswing.JLabel;
import org.aswing.JFrame;
import org.aswing.JPanel;
import org.aswing.JButton;
import org.aswing.JRadioButton;

import org.aswing.geom.IntPoint;
import org.aswing.geom.IntDimension;

class Sample002 extends JWindow{

private var rbX:JRadioButton;
private var rbY:JRadioButton;
private var group:ButtonGroup;
private var zzlayout:BoxLayout;
private var frame:JFrame;

public var bg:ButtonGroup;
public var title:String;

public function new() {
super(flash.Lib.current, true);
title = 'Example of BoxLayout';
initUI();
}

private function initUI():Void {
setBackground(new ASColor(0xffffff));

var rbPanel:JPanel = new JPanel();
rbX = new JRadioButton('BoxLayout.X_AXIS');
rbY = new JRadioButton('BoxLayout.Y_AXIS');
zzlayout = new BoxLayout();
rbX.addSelectionListener(onRadioChanged);
rbY.addSelectionListener(onRadioChanged);
rbX.setSelected(true);
group = new ButtonGroup();
group.append(rbX);
group.append(rbY);

rbPanel.append(new JLabel('方向'));
rbPanel.append(rbX);
rbPanel.append(rbY);
rbPanel.setLocation(new IntPoint(0, 0));
rbPanel.setSize(new IntDimension(400, 30));

getContentPane().append(rbPanel);

var gapPanel:JPanel = new JPanel();
gapPanel.append(new JLabel('間隔'));

var slider:JSlider = new JSlider(JSlider.HORIZONTAL, 0, 30, 0);
slider.addStateListener(onSliderChange);
gapPanel.append(slider);

gapPanel.setLocation(new IntPoint(0, 20));
gapPanel.setSize(new IntDimension(400, 30));
gapPanel.setBackground(new org.aswing.ASColor(0xFF00FF)); // 効かない?
gapPanel.setToolTipText("xxxTIPxxx");
getContentPane().append(gapPanel);

frame = new JFrame(this, title);
getContentPane().append(frame);

frame.getContentPane().setLayout(zzlayout);
frame.setLocation(new IntPoint(30, 50));
frame.setSize(new IntDimension(250, 150));

// たくさん並べるとよしなに幅や高さを等分してくれる
frame.getContentPane().append(new JButton('Button 1'));
frame.getContentPane().append(new JButton('Button 2'));
frame.getContentPane().append(new JButton('Button 3'));
frame.getContentPane().append(new JButton('Button 4'));

frame.show();
}

public function onRadioChanged(e:InteractiveEvent):Void {
var rb:JRadioButton = cast(e.target,JRadioButton);

switch(rb){
    case rbX:
zzlayout.setAxis(BoxLayout.X_AXIS);
    case rbY:
zzlayout.setAxis(BoxLayout.Y_AXIS);
    default:
trace("cannot change layout!");
}
updateLayout();
}

public function onSliderChange(e:InteractiveEvent):Void {
var s:JSlider = cast(e.target,JSlider);
zzlayout.setGap(s.getValue());
updateLayout();
}

private function updateLayout():Void {
frame.getContentPane().setLayout(zzlayout);
}
}

これを、以下のように呼び出す。
import org.aswing.geom.IntPoint;
import org.aswing.geom.IntDimension;

class Main
{
    static function main()
    {
var app:Sample002 = new Sample002();
app.setLocation(new IntPoint(0, 0));
app.setSize(new IntDimension(500, 500));
app.show();

//        flash.Lib.current.addChild(new Sample002());
    }
}

ちなみに、haxeコマンドに与えるcompile.hxmlはこんな感じ。
-swf-header 500:500:20:FFFFFF
-swf Main.swf
-cp hxclasses
-swf-lib concat.swf
-swf-version 9
-main Main

水曜日, 1月 06, 2010

[haXe] haxelibが変?

haXeでは、swfにしたアセットライブラリは、"-swf-lib"オプションに指定するのだが、これが1つしか受け付けられない様子。画像ファイルのswfとflコンポーネントのswfを同時に使いたかったので、この2つのアセットswfを纏める方法。

以下xmlを用意(ここではconcat.xmlとした)。
<movie width="320" height="240" framerate="12" version="9">
<frame><library>
<clip id="foo" import="spectrum.swf"/>
<clip id="foo" import="component.swf"/>
</library></frame>
</movie>

そして、swfmillを実行。
> swfmill.exe simple concat.xml concat.swf

意外に簡単!xmlのwidthとかは適当で良いようです。

日曜日, 12月 06, 2009

[haXe] haxelibが変?

haXeでは、haxelibコマンドを使ってライブラリを簡単にインストールすることができるハズだが、Windows環境ではhscriptがうまく入れられなった。メッセージはこちら。

In project: Unexpected element tag


この原因は2つある模様。

1つはhaxelibのバグ。本家では解決済なので、最新ソースをCVSで取得後、コンパイルすることで無事入るようになります(一応、このコンパイル後haxelib.exeを置いておきます)。

2つめはmライブラリパスの問題なようで、以下設定をすることで動くようになるハズ。

set HAXE_LIBRARY_PATH=c:\Program Files\Motion-Twin\haxe\std


パスは完了ごとに変えて下さい(\は実際は¥で指定します)。

火曜日, 11月 24, 2009

[HIVE] Solrのexample/books.csvを

以下スキーマで(Solrのexamplesにある)books.csvをHIVEに取り込むことができる。

create table books (
  id STRING,
  cat STRING,
  name STRING,
  price DOUBLE,
  inStock BOOLEAN,
  author_t STRING,
  series_t STRING,
  sequence INT,
  genre_s STRING)
 ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
 LINES TERMINATED BY '\n';

取りこむのは以下コマンド。
LOAD DATA INPATH '/tmp/books.csv' overwrite into table books ;

月曜日, 11月 09, 2009

[HIVE] 日本語が。。。

jdkのエンコードのせいだと思うのだけど(コマンドラインでUTF8は見えるから)、HIVEのコンソールでは日本語が使えない。直接cygwinのコマンドラインでなら使えるので、まぁいいのだけど。

$ /cygdrive/d/work/apache-hive/build/dist/bin/hive -hiveconf hadoop.bin.path="bash /cygdrive/d/work/apache-hadoop-0.19.2/bin/hadoop" -e "FROM zip z insert overwrite directory '/tmp/gina3' SELECT z.zip, z.pref, z.city, z.town  WHERE z.ver = '2008-12-26' AND z.town REGEXP '銀座';"

@ITの記事を参考に練習中。。

日曜日, 11月 08, 2009

[HIVE] HIVE上からHDFS操作

HIVE上からファイルを見るには。

hive> dfs  -ls /tmp;
Found 10 items
drwxr-xr-x   - 00962724 mkgroup          0 2009-11-24 02:27 /tmp/00962724
drwxr-xr-x   - 00962724 mkgroup          0 2009-11-03 03:24 /tmp/cy
-rw-r--r--   1 00962724 mkgroup       2740 2009-11-23 23:44 /tmp/FirstTest.jar
drwxr-xr-x   - 00962724 mkgroup          0 2009-11-09 01:21 /tmp/gina3
drwxr-xr-x   - 00962724 mkgroup          0 2009-11-09 01:13 /tmp/ginza
drwxr-xr-x   - 00962724 mkgroup          0 2009-11-24 02:25 /tmp/hadoop-00962724

drwxr-xr-x   - 00962724 mkgroup          0 2009-11-09 01:21 /tmp/hive-00962724
drwxr-xr-x   - 00962724 mkgroup          0 2009-11-09 00:16 /tmp/localfiles
drwxr-xr-x   - 00962724 mkgroup          0 2009-11-09 01:08 /tmp/prefff.dat
-rw-r--r--   1 00962724 mkgroup    6687150 2009-11-22 21:54 /tmp/sample.war
hive>

土曜日, 11月 07, 2009

[HIVE] HQLの関数を確認

意外に説明が充実してる。

hive> DESCRIBE FUNCTION EXTENDED substr;
OK
substr(str, pos[, len]) - returns the substring of str that starts at pos and is
 of length len
pos is a 1-based index. If pos<0 the starting position is determined by counting
 backwards from the end of str.
Example:
   > SELECT substr('Facebook', 5) FROM src LIMIT 1;
  'book'
  > SELECT substr('Facebook', -5) FROM src LIMIT 1;
  'ebook'
  > SELECT substr('Facebook', 5, 1) FROM src LIMIT 1;
  'b'
Time taken: 0.156 seconds
hive>

金曜日, 11月 06, 2009

[HIVE] select出来た!

cygwinだと、HIVEからhadoopを呼び出すところで失敗する。なのでこのためにはhiveconfオプションにて、hadoopのまるママの実行文を書いておくべし。

00962724@XXX /cygdrive/d/work/apache-hive/build/dist/conf
$ /cygdrive/d/work/apache-hive/build/dist/bin/hive -hiveconf hadoop.bin.path="bash /cygdrive/d/work/apache-hadoop-0.19.2/bin/hadoop" -e "SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';"

また、以下のようなエラーがでるときはmetadataが壊れていた様子。

Job Submission failed with exception 'java.lang.NullPointerException(null)'

"drop table"して(このコマンドも失敗したけど、その後"show tables"してテーブルが無いようなら"create table"してloadすれば、うまく動くようになった!

Hive history file=/tmp/00962724/hive_job_log_00962724_200911060205_2037141967.txt
Total MapReduce jobs = 1
Number of reduce tasks is set to 0 since there's no reduce operator
09/11/06 02:05:32 INFO exec.ExecDriver: Number of reduce tasks is set to 0 since there's no reduce operator
09/11/06 02:05:32 INFO exec.ExecDriver: Using org.apache.hadoop.hive.ql.io.HiveInputFormat
09/11/06 02:05:32 INFO exec.ExecDriver: Processing alias a
09/11/06 02:05:32 INFO exec.ExecDriver: Adding input file file:/user/hive/warehouse/invites/ds=2008-08-15
09/11/06 02:05:34 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
09/11/06 02:05:34 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
09/11/06 02:05:34 INFO mapred.FileInputFormat: Total input paths to process : 1
Job running in-process (local Hadoop)
09/11/06 02:05:35 INFO exec.ExecDriver: Job running in-process (local Hadoop)
09/11/06 02:05:35 INFO mapred.FileInputFormat: Total input paths to process : 1
09/11/06 02:05:35 INFO mapred.MapTask: numReduceTasks: 0
09/11/06 02:05:35 INFO ExecMapper: maximum memory = 1040515072
09/11/06 02:05:35 INFO ExecMapper: conf classpath = [file:/D:/tmp/hadoop-00962724/hadoop-unjar3921453707640367881/, file:/D:/work/apache-hive/build/dist/lib/hive_exec.jar, file:/D:/tmp/hadoop-00962724/hadoop-unjar3921453707640367881/classes]
09/11/06 02:05:35 INFO ExecMapper: thread classpath = [file:/D:/tmp/hadoop-00962724/hadoop-unjar3921453707640367881/, file:/D:/work/apache-hive/build/dist/lib/hive_exec.jar, file:/D:/tmp/hadoop-00962724/hadoop-unjar3921453707640367881/classes]
09/11/06 02:05:35 INFO exec.MapOperator: Adding alias a to work list for file /user/hive/warehouse/invites/ds=2008-08-15/kv2.txt
09/11/06 02:05:35 INFO exec.MapOperator: dump TS struct<foo:int,bar:string,ds:string>
09/11/06 02:05:35 INFO ExecMapper:
<MAP>Id =10
  <Children>
    <TS>Id =0
      <Children>
        <FIL>Id =1
          <Children>
            <FIL>Id =2
              <Children>
                <SEL>Id =3
                  <Children>
                    <FS>Id =4
                      <Parent>Id = 3 <\Parent>
                    <\FS>
                  <\Children>
                  <Parent>Id = 2 <\Parent>
                <\SEL>
              <\Children>
              <Parent>Id = 1 <\Parent>
            <\FIL>
          <\Children>
          <Parent>Id = 0 <\Parent>
        <\FIL>
      <\Children>
      <Parent>Id = 10 <\Parent>
    <\TS>
  <\Children>
<\MAP>
09/11/06 02:05:35 INFO exec.MapOperator: Initializing Self 10 MAP
09/11/06 02:05:35 INFO exec.TableScanOperator: Initializing Self 0 TS
09/11/06 02:05:35 INFO exec.TableScanOperator: Operator 0 TS initialized
09/11/06 02:05:35 INFO exec.TableScanOperator: Initializing children of 0 TS
09/11/06 02:05:35 INFO exec.FilterOperator: Initializing child 1 FIL
09/11/06 02:05:35 INFO exec.FilterOperator: Initializing Self 1 FIL
09/11/06 02:05:35 INFO exec.FilterOperator: Operator 1 FIL initialized
09/11/06 02:05:35 INFO exec.FilterOperator: Initializing children of 1 FIL
09/11/06 02:05:35 INFO exec.FilterOperator: Initializing child 2 FIL
09/11/06 02:05:35 INFO exec.FilterOperator: Initializing Self 2 FIL
09/11/06 02:05:35 INFO exec.FilterOperator: Operator 2 FIL initialized
09/11/06 02:05:35 INFO exec.FilterOperator: Initializing children of 2 FIL
09/11/06 02:05:35 INFO exec.SelectOperator: Initializing child 3 SEL
09/11/06 02:05:35 INFO exec.SelectOperator: Initializing Self 3 SEL
09/11/06 02:05:35 INFO exec.SelectOperator: SELECT struct<foo:int,bar:string,ds:string>
09/11/06 02:05:35 INFO exec.SelectOperator: Operator 3 SEL initialized
09/11/06 02:05:35 INFO exec.SelectOperator: Initializing children of 3 SEL
09/11/06 02:05:35 INFO exec.FileSinkOperator: Initializing child 4 FS
09/11/06 02:05:35 INFO exec.FileSinkOperator: Initializing Self 4 FS
09/11/06 02:05:35 INFO exec.FileSinkOperator: Writing to temp file: FS file:/tmp/hive-00962724/1005059804/_tmp.10001/_tmp.attempt_local_0001_m_000000_0
09/11/06 02:05:35 INFO exec.FileSinkOperator: Operator 4 FS initialized
09/11/06 02:05:35 INFO exec.FileSinkOperator: Initialization Done 4 FS
09/11/06 02:05:35 INFO exec.SelectOperator: Initialization Done 3 SEL
09/11/06 02:05:35 INFO exec.FilterOperator: Initialization Done 2 FIL
09/11/06 02:05:35 INFO exec.FilterOperator: Initialization Done 1 FIL
09/11/06 02:05:35 INFO exec.TableScanOperator: Initialization Done 0 TS
09/11/06 02:05:35 INFO exec.MapOperator: Initialization Done 10 MAP
09/11/06 02:05:35 INFO exec.MapOperator: 10 forwarding 1 rows
09/11/06 02:05:35 INFO exec.TableScanOperator: 0 forwarding 1 rows
09/11/06 02:05:35 INFO exec.FilterOperator: 1 forwarding 1 rows
09/11/06 02:05:35 INFO exec.FilterOperator: 2 forwarding 1 rows
09/11/06 02:05:35 INFO exec.SelectOperator: 3 forwarding 1 rows
09/11/06 02:05:35 INFO ExecMapper: ExecMapper: processing 1 rows: used memory = 2369824
09/11/06 02:05:35 INFO exec.MapOperator: 10 forwarding 10 rows
09/11/06 02:05:35 INFO exec.TableScanOperator: 0 forwarding 10 rows
09/11/06 02:05:35 INFO exec.FilterOperator: 1 forwarding 10 rows
09/11/06 02:05:35 INFO exec.FilterOperator: 2 forwarding 10 rows
09/11/06 02:05:35 INFO exec.SelectOperator: 3 forwarding 10 rows
09/11/06 02:05:35 INFO ExecMapper: ExecMapper: processing 10 rows: used memory = 2388056
09/11/06 02:05:35 INFO exec.MapOperator: 10 forwarding 100 rows
09/11/06 02:05:35 INFO exec.TableScanOperator: 0 forwarding 100 rows
09/11/06 02:05:35 INFO exec.FilterOperator: 1 forwarding 100 rows
09/11/06 02:05:35 INFO exec.FilterOperator: 2 forwarding 100 rows
09/11/06 02:05:35 INFO exec.SelectOperator: 3 forwarding 100 rows
09/11/06 02:05:35 INFO ExecMapper: ExecMapper: processing 100 rows: used memory = 2388056
09/11/06 02:05:36 INFO exec.MapOperator: 10 finished. closing...
09/11/06 02:05:36 INFO exec.MapOperator: 10 forwarded 500 rows
09/11/06 02:05:36 INFO exec.MapOperator: DESERIALIZE_ERRORS:0
09/11/06 02:05:36 INFO exec.TableScanOperator: 0 finished. closing...
09/11/06 02:05:36 INFO exec.TableScanOperator: 0 forwarded 500 rows
09/11/06 02:05:36 INFO exec.FilterOperator: 1 finished. closing...
09/11/06 02:05:36 INFO exec.FilterOperator: 1 forwarded 500 rows
09/11/06 02:05:36 INFO exec.FilterOperator: PASSED:500
09/11/06 02:05:36 INFO exec.FilterOperator: FILTERED:0
09/11/06 02:05:36 INFO exec.FilterOperator: 2 finished. closing...
09/11/06 02:05:36 INFO exec.FilterOperator: 2 forwarded 500 rows
09/11/06 02:05:36 INFO exec.FilterOperator: PASSED:500
09/11/06 02:05:36 INFO exec.FilterOperator: FILTERED:0
09/11/06 02:05:36 INFO exec.SelectOperator: 3 finished. closing...
09/11/06 02:05:36 INFO exec.SelectOperator: 3 forwarded 500 rows
09/11/06 02:05:36 INFO exec.FileSinkOperator: 4 finished. closing...
09/11/06 02:05:36 INFO exec.FileSinkOperator: 4 forwarded 0 rows
09/11/06 02:05:36 INFO exec.FileSinkOperator: Committed to output file: file:/tmp/hive-00962724/1005059804/_tmp.10001/attempt_local_0001_m_000000_0
09/11/06 02:05:36 INFO exec.SelectOperator: 3 Close done
09/11/06 02:05:36 INFO exec.FilterOperator: 2 Close done
09/11/06 02:05:36 INFO exec.FilterOperator: 1 Close done
09/11/06 02:05:36 INFO exec.TableScanOperator: 0 Close done
09/11/06 02:05:36 INFO exec.MapOperator: 10 Close done
09/11/06 02:05:36 INFO ExecMapper: ExecMapper: processed 500 rows: used memory = 2459320
09/11/06 02:05:36 INFO mapred.TaskRunner: Task:attempt_local_0001_m_000000_0 is done. And is in the process of commiting
09/11/06 02:05:36 INFO mapred.LocalJobRunner:
09/11/06 02:05:36 INFO mapred.TaskRunner: Task attempt_local_0001_m_000000_0 is allowed to commit now
09/11/06 02:05:36 INFO mapred.FileOutputCommitter: Saved output of task 'attempt_local_0001_m_000000_0' to file:/tmp/hive-00962724/384798627
09/11/06 02:05:36 INFO mapred.LocalJobRunner: file:/user/hive/warehouse/invites/ds=2008-08-15/kv2.txt:0+5791
09/11/06 02:05:36 INFO mapred.TaskRunner: Task 'attempt_local_0001_m_000000_0' done.
2009-11-06 02:05:36,156 map = 100%,  reduce = 0%
09/11/06 02:05:36 INFO exec.ExecDriver: 2009-11-06 02:05:36,156 map = 100%,  reduce = 0%
Ended Job = job_local_0001
09/11/06 02:05:36 INFO exec.ExecDriver: Ended Job = job_local_0001
09/11/06 02:05:36 INFO exec.FileSinkOperator: Moving tmp dir: file:/tmp/hive-00962724/1005059804/_tmp.10001 to: file:/tmp/hive-00962724/1005059804/_tmp.10001.intermediate
09/11/06 02:05:36 INFO exec.FileSinkOperator: Moving tmp dir: file:/tmp/hive-00962724/1005059804/_tmp.10001.intermediate to: file:/tmp/hive-00962724/1005059804/10001
OK
Time taken: 27.86 seconds

00962724@XXX /cygdrive/d/work/apache-hive/build/dist/conf

木曜日, 11月 05, 2009

[HIVE] 準備が結構。。。

Hadoopも、JavaのScalaと同様に楽をしたいためHIVEを使おうと思って準備。したのだけど結構はまったのでメモ。

・Hadoopをインストール
HIVEにするといってもHadoopは事前に入れておく必要がある様子。このときおとなしくcygwinを入れるべし。中でdfとか使うのでbash.exeなどを入れていても(それだけでは)途中でこける。

・HIVEをインストール

ivy(というmavenみたいな構成管理ツール)が曲者。というかtrunkをsvnで取ってきたのだけど、中でもう古い、たとえばv0.19.0みたいなHadoopをdownloadしようとしてしまう。なので以下2ファイルを書き替える必要があった。
apache-hive\shims\ivy.xml
apache-hive\shims\build.xml
これらの中で、使いたいHadoopバージョンだけを残せばOK(私はv0.19.2だけを入れました)。あと、普通に入れると途中のHadoopダウンロードが遅いので、
D:\work>ant -Dhadoop.mirror="http://www.meisei-u.ac.jp/mirror/apache/dist" -Dhadoop.version=0.19.2 package
のとおり、ダウンロードサイトを指定すると吉。

補足:
cygwinのv1.7をUTF8化する方法はこちら