hiveのloadコマンドに謎の制約

LOAD DATA LOCAL INPATH '/dir/_hoge' ...
みたく、ファイル名が “_” 始まりのファイルをLOADしようとしたら、何故か「そんなファイルはねえ!」と怒られエラーになった。

回避策としては、頭にワイルドカード入れる。以下なら正常終了。
LOAD DATA LOCAL INPATH '/dir/*hoge' ...

Hive 1.2.1000.2.5.0.0-1245 (HDP 2.5.0.0-1245) にて確認。

process substitution は bash とかでないと使えないぽい。

shebang#!/bin/sh と書いてたり、 sh hoge.sh とかで実行した際、ときどきbash以外のshellが起動されるのか、process substitution のコードがエラーになることがある。
#!/bin/bash とか bash hoge.sh とかすると動いた。

Mapper/ReducerではrunというメソッドもOverrideできる

ということを今更知った。 runのデフォルトの実装の中で、setup, map/reduce, cleanup を呼び出している。

Mapper (Apache Hadoop Main 2.7.3 API)

Reducer (Apache Hadoop Main 2.7.3 API)

参考:in-mapper combining(MapReduceデザインパターン) | mwSoft

自作クラスでHadoopのGeneric Optionsを使えるようにする。

最近、Hadoop忘れてきたのでメモ…

自作クラスにToolを実装させればHadoopのGeneric Optionsを解釈してくれるようになる。

Generic Options

つまり、-confオプションでHadoopの設定を上書きしたりできるようになる。

attrbuteに対する||=でハマる。

class some_class
  attr_accessor :hoge

  def some_method
    hoge ||= "value"
  end

この5行目で、hogeのアクセサが呼ばれるのではなく、hogeという新しい変数が定義されてしまう…

@hoge ||= "value"

とするしかない。

bashの関数はwhichコマンドしても出処が分からない

which や whereis でコマンドのパスが出ないんで「なんだろうな?」と思ったが、よく考えたら .bash_profile で定義しているbash関数だった。 関数の定義は以下で確認できる。

declare -f [function name]

ディレクトリのハードリンク恐い…

coreutils入れて ln -F すればディレクトリのハードリンクも作れるのだが、消すには rm -fr するしかなさそう。 そうすると、ディレクトリの中身も消えてしまう… 一旦、中身の場所を移し、ハードリンク消してから戻せば良さそうだが、中身が多いとちょっと大事…

よく分かって無くて rm -fr を消してしまった。 Box Syncでバックアップしてたので戻せたのだが、Box Syncはdotfileをバックアップしてくれないので、難儀した…