MAPJOINメモ

table_m : 10000件
table_a : 1000件
table_b : 1000件

select count(*) from table_m m
join table_a a on (m.link1=a.id)
join table_b b on (m.link2=b.id)

Time taken: 42.128 seconds
  • MapJoin

メモリにハッシュテーブルを持ってMapフェーズのみでJoinをしてくれる

select / *+ MAPJOIN(table_a,table_b) */ count(*) 
from table_m m
join table_a a on (m.link1=a.id)
join table_b b on (m.link2=b.id)

--result
Time taken: 27.502 seconds  

環境変数を設定することで
指定サイズまでのテーブルは自動でMapJoinしてくれる

set hive.auto.convert.join=true;
set hive.smalltable.filesize=10000;

MySQL :: MySQL 4.1 リファレンスマニュアル :: 5.2.8 MySQL による ORDER BY の最適化

ジョブ関連メモ

ジョブをバックグラウンドで実行

(ジョブ) &

ログアウト後も実行させ続ける

nohup (ジョブ) &

実行途中でバックに移す

Ctrl + Z

# bg

Linuxコマンド集 - 【 nohup 】 ログアウトした後もコマンドを実行し続ける:ITpro
Linuxコマンド集 - 【 & 】 コマンドをバックグラウンドで実行する:ITpro

hadoopジョブの確認

hadoop job -list 

$ hadoop job -list
1 jobs currently running
JobId   State   StartTime       UserName        Priority        SchedulingInfo
job_201404160730_4623   1       1401699760610   hadoop  NORMAL  NA

hadoopジョブのkill

hadoop job -kill (ジョブID)

http://blog.livedoor.jp/sasata299/archives/51387077.html

1年くらいのまとめ

  • 開発インフラ
SCM Subversion,Git
BTS JIRA
CI CruiseControl
IDE Eclipse(pleiades)

マシンはWindows

やったこと

HTTPリクエストからバックに問い合わせてJSONを返却

テストコードはJUnit

Java
maven
JavaServlet
Spring
Jersey

  • ログ解析アプリ

ログ鯖のログをHDFSへ取り込み
HDFSから整形してRDBMSに取り込み
RDBMSのデータをレポートに加工(tsv,html)

Bash
Perl

XMinメモ

  • ForceArray

配列前提で値を取っていく時
素数1の場合、配列として読まれないのでForceArrayする

my $data = $xml->XMLin($target_file,ForceArray => ['playlist']);

while ($i<$MAX) {

    my $Id = $data->{'List'}[$i]->{'Item'}->{'Id'};
    $i++;
  • 値チェック

空の要素がある場合リファレンスを返すのでスカラーであることを確認する

#xml
<List>
<Item>
<Id>1</Id>
<Value>test1</Value>
</Item>
<Item>
<Id></Id>
<Value>test2</Value>

#Dumper
$VAR1 = {
      'Item' => [
                {
                  'Value' => 'test1',
                  'Id' => '1'
                },
                {
                  'Value' => 'test2',
                  'Id' => {}
                },


#perl
unless (ref $data->{'List'}[$i]->{'Item'}->{'Id'}){
    ...
    }else{
    # error
    }

ESCAPE BY

MySQLでテーブルに一部データが正常に登録されていない

MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.2.5 LOAD DATA INFILE 構文

\はデフォルトのエスケープ文字として読まれているらしい

LOAD DATA LOCAL INFILE 'FILEPATH'
INTO TABLE TABLE
FIELDS ESCAPED BY ''
(col_name,...)

ESCAPE BYで指定してやる

シーケンスファイルテーブルにテキストファイルをloadする方法

シーケンスファイルフォーマットで作ったテーブルにテキストファイルを入れたい時

CREATE TABLE table (
val1 string,
val2 string
)
STORED AS SEQUENCEFILE

likeしてalter tableすればスキーマをハードコードせずに済む

CREATE TABLE work_table LIKE table;
ALTER TABLE work_table SET FILEFORMAT TEXTFILE;
ALTER TABLE work_table SET SERDEPROPERTIES ( 'field.delim' = '\t' );
ALTER TABLE work_table SET SERDEPROPERTIES ( 'line.delim' = '\n' );
ALTER TABLE work_table SET SERDEPROPERTIES ( 'serialization.format' = '\t' );

#work_tableに一旦load

#tableにwork_tableをinsert

特殊文字のエスケープシーケンス

HIVEで文字列を|区切りにしたい時

SPLIT('a|bb|ccc','¥¥|')

でHIVEコマンドは動くんだけど

hive -e " SPLIT('a|bb|ccc','¥¥|') "

の時うまく動かない

結局

hive -e " SPLIT('a|bb|ccc','¥¥¥|') "

で¥3つつけるとうまいこといけました
詳しいことはわからんけど、hiveにコマンド渡す時、更にエスケープシーケンスが要るってことですかね